Downsample data to save space
pupiltimecourse.data is dowsnampled but doesn’t have all participants < 400
but the script pupiltimecourseexp2.Rmd has what we need to do the same dowsnampling
Goal - take pupil timecourse, dowsnample and then mrge it it behavioural data so that we can do the additional arousal pupil analyses that check for timecourse things.
check gazeR or downsampling
to do, do the same arousal correlation with valence
library(ggplot2)
library(tidyverse)
install.packages("gazer")
library(gazer)
?gazer::downsample_gaze
?gazer::downsample_pupil
unique(X_tmp_df4_full$Condition)
# gazer::downsample_gaze%
tmp.df4_full_stim<- X_tmp_df4_full %>%
subset(screencontent == "stim")
# create bins
# install.packages("OneR")
install.packages("OneR")
library(OneR)
?bin
tmp.df4_full_stim$timebin<- OneR::bin(tmp.df4_full_stim$timerezero3, nbin = 60)
# dowsample by averaging?
colnames(tmp.df4_full_stim)
tmp.df4_full_stim_downs
tmp.df4_full_stim_downs <- tmp.df4_full_stim %>%
group_by(ssid, tNo, timebin, trial,trialUnq)%>%
summarise_at(c('timerezero3','pup_basCor', 'gaze_x_cor_pix', 'gaze_y_cor_pix'),
mean, na.rm = TRUE)
?saveRDS
saveRDS(tmp.df4_full_stim_downs, "tmp.df4_full_stim_downs.rds")
# create klarger bins
tmp.df4_full_stim_downs_jun2021
tmp.df4_full_stim_downs_jun2021_with_beh
range(tmp.df4_full_stim_downs$timerezero3)
tmp.df4_full_stim_downs_jun2021_with_beh$timebin2 <- OneR::bin(tmp.df4_full_stim_downs_jun2021_with_beh$timerezero3, nbin = 30)
tmp.df4_full_stim_downs_jun2021_with_beh2 <- tmp.df4_full_stim_downs_jun2021_with_beh %>%
group_by(ssid, tNo, timebin2, trial,trialUnq)%>%
summarise_at(c('timerezero3','pup_basCor', 'gaze_x_cor_pix', 'gaze_y_cor_pix'),
mean, na.rm = TRUE)
nrow(tmp.df4_full_stim_downs_jun2021_with_beh2)
87529
pupil arousal
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, mediansplit_self_arousal, Alexithymia, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_self_arousal, pup_basCor, color = mediansplit_self_arousal,fill = mediansplit_self_arousal))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
# xlab("Arousal")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_self_valence)
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

brightness

Participants section
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(Group == "NT")%>%
# subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, mediansplit_ground_arousal, Alexithymia, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_arousal, pup_basCor, color = mediansplit_ground_arousal,fill = mediansplit_ground_arousal))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
# xlab("Arousal")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_ground_valence)
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, mediansplit_ground_arousal, Alexithymia, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_arousal, Mean, color = mediansplit_ground_arousal,fill = mediansplit_ground_arousal))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
# xlab("Arousal")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_ground_valence)+
# facet_grid(~BRIGHTNESS_mediansplit)+
ylim(90,130)
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

okay let’s create averages frio this entire sample and use those to devide the stimuli
self aropusal might be biased by problematic folks but averages for the entire sample should not
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid_num< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, self_arousal_lab, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(self_arousal_lab, pup_basCor, color = self_arousal_lab,fill = self_arousal_lab))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
# xlab("Arousal")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_self_valence)
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid_num< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, ground_arousal_lab, Alexithymia, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(ground_arousal_lab, pup_basCor, color = ground_arousal_lab,fill = ground_arousal_lab))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
xlab("Arousal")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

Resposne bias

ceiliing effect?
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, stimIAPS, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, pup_basCor))+
geom_point()+
# stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Arousal")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()+
ylim(-3.3,1.3)
ceiling effect?
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(mediansplit_ground_valence)%>%
mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
group_by(mediansplit_ground_valence)%>%
mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, pup_basCor))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary( geom = 'pointrange', alpha = .4, size = 1, colour = "Black") +
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
Ignoring unknown parameters: fun.y

db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(mediansplit_ground_valence)%>%
mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
group_by(mediansplit_ground_valence)%>%
mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, pup_basCor))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary( geom = 'pointrange', alpha = .4, size = 1, colour = "Black") +
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_self_valence, pup_basCor))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary( geom = 'pointrange', alpha = .5, size = 1, colour = "Black") +
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
# db_full4new_stim_screen_pupil_nopract$arousal_outler
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, mediansplit_sample_arousal2, mediansplit_sample_valence2)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_sample_arousal2, arousal))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary( geom = 'pointrange', alpha = .5, size = 1, colour = "Black") +
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_sample_valence2)+
ggpubr::stat_cor()
Ignoring unknown parameters: fun.y

otehr confounds - eye movements
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, mean_fix_dur))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
unique(db_full4new_stim_screen_pupil_nopract$ValenceMeanThisSample)
median(db_full4new_stim_screen_pupil_nopract$ValenceMeanThisSample)
median(db_full4new_stim_screen_pupil_nopract$valence)
median(db_full4new_stim_screen_pupil_nopract$arousal)
median(db_full4new_stim_screen_pupil_nopract$ArousalMeanThisSample)
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_self_valence, mean_fix_dur))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
# data loss gaze
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, fix_count))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, SacAmp))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, sdevgaze))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, gaze_loss_prop))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
ylim(-3.3,1.3)
db_full4new_stim_screen_pupil_nopract%>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_mean = mean(pup_basCor, na.rm = TRUE), sd_pup = sd(pup_basCor, na.rm = TRUE), subj = n())%>%
group_by(ssid, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(mediansplit_ground_valence)%>%
# mutate(pup_basCor_se = sd_pup/(sqrt(subj)))%>%
ggplot(aes(mediansplit_ground_valence, total_fix_dur))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(geom = 'pointrange', alpha = .1, size = 1, colour = "Black") +
# geom_errorbar(aes(ymin = pup_basCor_mean-pup_basCor_se, ymax = pup_basCor_mean+pup_basCor_se ))+
geom_smooth(method = 'lm', se = F)+
p$graphstyle+
xlab("Valence")+
# ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
let’s model it formally
remember baseline corection is equivalendt to stimuli intercept
pupil_arousal_findings<- list()
library(lmerTest)
unique(db_full4new_stim_screen_pupil_nopract$stimIAPS)
unique(substr(db_full4new_stim_screen_pupil_nopract$stimIAPS, 1,8))
db_full4new_stim_screen_pupil_nopract$Label<- substr(db_full4new_stim_screen_pupil_nopract$stimIAPS, 1,8)
db_full4new_stim_screen_pupil_nopract<- left_join(db_full4new_stim_screen_pupil_nopract, imageJ_IAPS, by = "Label")
nrow(db_full4new_stim_screen_pupil_nopract)
# rows = 2858
db_full4new_stim_screen_pupil_nopract$Mean_gray_z<- scale(db_full4new_stim_screen_pupil_nopract$Mean, center = TRUE, scale = TRUE)[,1]
options(contrasts = c("contr.sum","contr.poly"))
options(scipen = 999)
db_full4new_stim_screen_pupil_nopract$ssid_num <- as.numeric(as.character(db_full4new_stim_screen_pupil_nopract$ssid))
pupil_arousal_findings$pupil_from_arousal <- lmer(pup_basCor ~ arousal_c*Mean_gray_z +(1 +Mean_gray_z | ssid) + (0+arousal_c| ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500 &
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_arousal)
# singularity (drop arousal c slope)
# is there a coorelationbtween mean arousal rating and meagray(
db_full4new_stim_screen_pupil_nopract%>%
group_by(stimIAPS,ground_valence_lab) %>%
summarise_at(c('arousal_c', 'Mean_gray_z'), mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, Mean_gray_z, color = ground_valence_lab))+
geom_point()+
ggpubr::stat_cor()
# <- predict(pupil_arousal_findings$pupil_from_arousal)
db_full4new_stim_screen_pupil_nopract %>%
group_by(stimIAPS) %>%
# summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# summarise_at(c('arousal_c', 'Mean_gray_z'), mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, pup))+
geom_smooth(aes(group = ssid, alpha = ssid), method = 'lm', se = F)
# geom_smooth(aes(group = stimIAPS), method = 'lm', se = F)
ggpubr::stat_cor()
cor.test(db_full4new_stim_screen_pupil_nopract\(, db_full4new_stim_screen_pupil_nopract\))
# if we put brighteness and arousal we see no interaction which means we probably don't need to worry about brighteness, it doesn't change effects of arousal self report
# db_full4new_stim_pupil$pup
pupil_arousal_findings$pupil_from_arousal <- lmer(pup_basCor ~ arousal_c+Mean_gray_z +(1 +Mean_gray_z | ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract$pup, pupil_outlier == FALSE & ssid_num< 500&
arousal_outler == FALSE))
install.packages('usdm')
usdm::vif(as.data.frame(db_full4new_stim_screen_pupil_nopract[,c('arousal', 'valence')]))
pupil_arousal_findings$pupil_from_arousal_withval <- lmer(pup_basCor ~ arousal_c*valence_c* Mean_gray_z +(1 +Mean_gray_z | ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500&
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_arousal_withval)
car::vif(pupil_arousal_findings$pupil_from_arousal_withval)
lmerTest::step(pupil_arousal_findings$pupil_from_arousal_withval)
# control for baseline arousal ratings
pupil_arousal_findings$pupil_from_arousal_withval
summary(lmer(pup_basCor ~ arousal_c*valence_c+ Mean_gray_z +(1 | ssid) + (1|stimIAPS),
# (1|ArousalMean)+ (1|ArousalMean), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & Group == "NT" &
arousal_outler == FALSE)))
# arousal_c:valence_c 0 35.52 35.52 1 2150.19 13.5760 0.0002348 ***
pupil_arousal_findings$arousal_from_pupil <- lmer(arousal ~ pup_basCor * Mean_gray_z +(1+pup_basCor | ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid!= 610&
arousal_outler == FALSE))
summary(pupil_arousal_findings$arousal_from_pupil)
# what about valence
pupil_arousal_findings$pupil_from_valence <- lmer(pup_basCor ~ valence_c+Mean_gray_z +(1 +Mean_gray_z | ssid) +
(0 +valence_c | ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid!= 610&
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_arousal)
summary(pupil_arousal_findings$pupil_from_valence)
Valence and arousal
pupil_arousal_findings$pupil_from_ar_vale <- lmer(pup_basCor ~ (valence_c* arousal_c) + Mean_gray_z +
(1 + Mean_gray_z | ssid),
# (0+ valence_c* arousal_c | ssid),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500 &
arousal_outler == FALSE))
db_full4new_stim_screen_pupil_nopract$total_fix_dur_z<- scale(db_full4new_stim_screen_pupil_nopract$total_fix_dur, center = TRUE, scale = TRUE)[,1]
pupil_arousal_findings$pupil_from_ar_val_gaze <- lmer(pup_basCor ~ (valence_c * arousal_c * total_fix_dur_z)+ Mean_gray_z +
+
(1 + Mean_gray_z | ssid),
# (0+ total_fix_dur_z | ssid),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500 &
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_ar_val_gaze )
summary(pupil_arousal_findings$pupil_from_ar_vale)
car::vif(pupil_arousal_findings$pupil_from_ar_val_gaze)
anova(pupil_arousal_findings$pupil_from_ar_vale, pupil_arousal_findings$pupil_from_arousal)
# interaction valence and arousal
control for gaze
# avg fix dur
db_full4new_stim_screen_pupil_nopract$mean_fix_dur_z<- scale(db_full4new_stim_screen_pupil_nopract$mean_fix_dur, center = TRUE, scale = TRUE)[,1]
pupil_arousal_findings$pupil_from_ar_val_gaze <- lmer(pup_basCor ~ (valence_c * arousal_c * mean_fix_dur_z)+ Mean_gray_z +
+
(1 + Mean_gray_z | ssid),
# (0+ total_fix_dur_z | ssid),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500 &
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_ar_val_gaze )
interactions::interact_plot(pupil_arousal_findings$pupil_from_ar_val_gaze , pred = arousal_c, modx = mean_fix_dur_z)
# fix count
db_full4new_stim_screen_pupil_nopract$fix_count_z<- scale(db_full4new_stim_screen_pupil_nopract$fix_count, center = TRUE, scale = TRUE)[,1]
pupil_arousal_findings$pupil_from_ar_val_gaze <- lmer(pup_basCor ~ (valence_c * arousal_c * fix_count_z)+ Mean_gray_z +
+
(1 + Mean_gray_z | ssid),
# (0+ total_fix_dur_z | ssid),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid_num< 500 &
arousal_outler == FALSE))
summary(pupil_arousal_findings$pupil_from_ar_val_gaze )
interactions::interact_plot(pupil_arousal_findings$pupil_from_ar_val_gaze , pred = arousal_c, modx = mean_fix_dur_z)
interactions::interact_plot(pupil_arousal_findings$pupil_from_ar_vale , pred = valence_c, modx = arousal_c)
interactions::interact_plot(pupil_arousal_findings$pupil_from_ar_vale , pred =arousal_c , modx = valence_c)
car::vif(pupil_arousal_findings$pupil_from_ar_vale) #curoff 2.5?
cor.test(db_full4new_stim_screen_pupil_nopract$valence_c, db_full4new_stim_screen_pupil_nopract$arousal_c)
rmcorr_valence_arousal <- rmcorr::rmcorr(participant = "ssid", measure1 = "valence_c", measure2 = "arousal_c", data = db_full4new_stim_screen_pupil_nopract)
plot(rmcorr_valence_arousal)
?rmcorr
db_full4new_stim_screen_pupil_nopract %>%
group_by(stimIAPS)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(ArousalMean, ValenceMean))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
theme_classic()
db_full4new_stim_screen_pupil_nopract %>%
group_by(stimIAPS)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, valence_c))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
theme_classic()
# with arousal as DV
pupil_arousal_findings$aroual_from_pup <- lmer(arousal ~ valence_c*pup_basCor * BRIGHTNESSc + (1| stimIAPS)+
(1 | ssid)+(0 +valence_c | ssid), REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, pupil_outlier == FALSE & ssid!= 610&
arousal_outler == FALSE))
summary(pupil_arousal_findings$aroual_from_pup)
anova(pupil_arousal_findings$aroual_from_pup)
interactions::interact_plot(pupil_arousal_findings$aroual_from_pup , pred = valence_c, modx = pup_basCor)
interactions::interact_plot(pupil_arousal_findings$aroual_from_pup, pred =pup_basCor , modx = valence_c)
# for positive valenced stimuli participants reporte higher arousal to more dilated pupils
#for negatively valence they report feeling negative even when they don't show strog pupil dilation
# same pattern
# pupil is more alighned with objective arousal in the positive trials
mixed model is consistent wth the previous plot, arousal effects on pupil is modulated by valence. in other words there is a consistent effect between pupil and self-repot of arousal more for positive emotions.
analyse the correlationla way since we are aggregating we don’t need to worry too much about brighteness as every person sees every stimuli in all brightness levels CONCORDANCE
db_full4new_stim_screen_pupil_nopract%>%
group_by(mediansplit_self_valence_thissample, stimIAPS)%>%
summarise_at(c("arousal", 'valence'), mean, na.rm = TRUE)%>%
arrange(stimIAPS)
test_anovas<- db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_valence2,mediansplit_sample_arousal2)%>%
mutate(cortest = cor(arousal_c, pup_basCor, use = "complete"))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_valence2,mediansplit_sample_arousal2)%>%
mutate(cortest = cor(arousal_c, pup_basCor, use = "complete"))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_sample_valence2, cortest, color = mediansplit_sample_valence2))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
theme_classic()+
geom_hline(yintercept = .2, linetype = 'dashed', alpha = .2)+
# ggpubr::stat_compare_means(paired = TRUE)+
ggpubr::stat_compare_means()+
facet_grid(~mediansplit_sample_arousal2)
# let's identify the folks that show less of a difference between conditions.
flag_pos_neg<- db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_valence2)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor)$estimate)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
mutate(cor_pos_neg_diff = cortest[mediansplit_sample_valence2 == "More positive"] -
cortest[mediansplit_sample_valence2 == "More negative"])%>%
mutate(cor_pos_neg_diff_lab = if_else(cor_pos_neg_diff>0, "pos > neg", "neg > pos"))%>%
group_by(ssid,cor_pos_neg_diff_lab)%>%
summarise_at(c("cor_pos_neg_diff"), mean, na.rm = TRUE)
# subset(cor_pos_neg_diff<= 0)%>%
ggplot(aes(mediansplit_sample_valence2, cortest, color = mediansplit_sample_valence2))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
theme_classic()+
geom_hline(yintercept = .2, linetype = 'dashed', alpha = .2)
# ggpubr::stat_compare_means(paired = TRUE)+
ggpubr::stat_compare_means()
testcor <-cor(db_full4new_stim_screen_pupil_nopract$arousal, db_full4new_stim_screen_pupil_nopract$valence)
testcor
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_valence2, mediansplit_sample_arousal2)%>%
# mutate(cortest = cor.test(arousal_c, pup_basCor)$estimate)%>%
mutate(cortest = cor(arousal_c, pup_basCor, method = 'kendall'))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_sample_valence2, cortest, color = mediansplit_sample_valence2))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
theme_classic()+
facet_grid(~mediansplit_sample_arousal2)+
geom_hline(yintercept = .2, linetype = 'dashed', alpha = .2)
# ggpubr::stat_compare_means(paired = TRUE)+
# ggpubr::stat_compare_means()
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_arousal2, mediansplit_sample_valence2)%>%
# mutate(cortest = cor.test(arousal_c, pup_basCor)$estimate)%>%
mutate(cortest = cor(valence_c, pup_basCor, method = 'kendall'))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_sample_arousal2, cortest, color = mediansplit_sample_arousal2))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
theme_classic()+
facet_grid(~mediansplit_sample_valence2)+
geom_hline(yintercept = .2, linetype = 'dashed', alpha = .2)
same as plot above but with valence in the correlation
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_sample_arousal2)%>%
mutate(cortest = cor.test(valence_c, pup_basCor)$estimate)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_sample_arousal2, cortest, color = mediansplit_sample_arousal2))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
theme_classic()
# ggpubr::stat_compare_means(paired = TRUE)+
ggpubr::stat_compare_means()
# ground
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_ground_valence)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor, use = "complete")$estimate)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_valence, cortest, color = mediansplit_ground_valence))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .3)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
# ggpubr::stat_compare_means(paired = TRUE)+
# ggpubr::stat_compare_means()
theme_classic()
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_ground_valence, mediansplit_ground_arousal)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor, use = "complete")$estimate)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_valence, cortest, color = mediansplit_ground_valence))+
geom_bar(stat="summary", fun.y = "mean", alpha = .4)+
geom_jitter(width = .1, alpha = .3)+
stat_summary( geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', color = "black", alpha = .1)+
ylab("R pupil vs self report arousal")+
# ggpubr::stat_compare_means(paired = TRUE)+
# ggpubr::stat_compare_means()
theme_classic()+
facet_grid(~mediansplit_ground_arousal)
Ignoring unknown parameters: fun.y

db_pupil_concordance_agg_ground <- db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_ground_valence)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor, use = "complete")$estimate)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)
afex::aov_ez(id = "ssid",
data = db_pupil_concordance_agg,
between = NULL,
within = 'mediansplit_ground_valence',
dv = 'cortest')
unique(db_full4new_stim_screen_pupil_nopract$tNo)
db_pupil_concordance_agg_self <- db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE)%>%
subset( arousal_outler == FALSE & !is.na(Alexithymia))%>%
subset(!is.na(Alexithymia))%>%
# subset(Group == "NT")%>%
subset(ssid_num<500)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_self_arousal, mediansplit_self_valence)%>%
mutate(cortest = cor(arousal_c, pup_basCor, use = "complete"))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)
afex::aov_ez(id = "ssid",
data = test_anovas,
between = NULL,
within = 'mediansplit_sample_valence2',
dv = 'cortest')
afex::aov_ez(id = "ssid",
data = subset(test_anovas, mediansplit_sample_valence2 == "More positive"),
between = NULL,
within = 'mediansplit_sample_arousal2',
dv = 'cortest')
afex::aov_ez(id = "ssid",
data = db_pupil_concordance_agg_self,
between = NULL,
within = 'mediansplit_ground_valence',
dv = 'cortest')
# valence and arousal
afex::aov_ez(id = "ssid",
data = test_anovas,
between = NULL,
within = c('mediansplit_sample_arousal2','mediansplit_sample_valence2'),
dv = 'cortest')
db_parsed_f_summ<- db_parsed_f %>%
group_by(tNo, ssid)%>%
summarise_at(c('Duration', 'mean_x', 'mean_y'), sum, na.rm = TRUE)
ggplot(aes(tNo, Duration))+
stat_summary(geom = 'pointrange')+
geom_point(alpha = .1)
unique(db_parsed_f_summ$ssid)
unique(db_parsed_f_summ$tNo)
unique(db_full4new_stim_screen_pupil_nopract$tNo)
unique(db_full4new_stim_screen_pupil_nopract$ssid)
nrow(db_full4new_stim_screen_pupil_nopract)
nrow(db_parsed_f_summ)
table(is.na(db_parsed_f_summ$ssid))
db_parsed_f_summ$total_fix_dur<- db_parsed_f_summ$Duration
db_parsed_f_summ$tNo<- as.character(db_parsed_f_summ$tNo)
db_parsed_f_summ$ssid<- as.character(db_parsed_f_summ$ssid)
db_full4new_stim_screen_pupil_nopract$Duration<- NULL
db_full4new_stim_screen_pupil_nopract$total_fix_dur<- NULL
db_full4new_stim_screen_pupil_nopract<- left_join(db_full4new_stim_screen_pupil_nopract, db_parsed_f_summ)
I HAVE THE IMPRESSION THAT WHAT THIS ANALYSES GIVES US IS THE SAME AS THE MIXED MODEL AS THIS CONCIORDANCE CAN BE EXPRESSED IN TERMS FO THE SLOPE OF THE AOUSAL AND PUPIL RELATION
SO ION OTHER WORDS IS not that pupil tracksvalence is that arousal based pupil is modulated by valence
by why is that - bias is responding? eg.. people response they feel negative even when they don’t (ie. when we have no objective indicator that they do feel) - is it something about the stimuli, positive arousal is sexual here? - or arousal interferes with appraisal. high arousing stimuli are distracting??
timecourse models of pupil
Pupil tracks valence
db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler== FALSE)%>%
subset(ssid< 500)%>%
subset(pupil_outlier == FALSE)%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, self_arousal_lab, Alexithymia, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(self_arousal_lab, pup_basCor, color = self_arousal_lab,fill = self_arousal_lab))+
geom_hline(yintercept = 0, linetype = "dashed", size = 2, alpha = .2)+
# geom_half_violin(colour = FALSE, alpha = .3, size = 5)+
geom_bar(stat="summary", fun.y = "mean", alpha = .4, color = FALSE)+
geom_jitter(width = .1, alpha=.2)+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1, size = 1, colour = "Black") +
stat_summary(geom = 'pointrange', width =1)+
p$graphstyle+
xlab("Arousal")+
ylab("Baseline corrected pupil")+
scale_color_brewer(palette = "Dark2")+
scale_fill_brewer(palette = "Dark2")+
facet_grid(~mediansplit_self_valence)
Ignoring unknown parameters: fun.yIgnoring unknown parameters: width

combine timecourse
let’s put pupil scr and ht prediction on subjective arousal
tmp.df4_full_stim_downs_jun2021_with_beh2$timebin2
[1] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[5] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[9] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[13] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[17] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[21] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[25] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[29] (6.01,6.23] (0.0411,0.261] (0.261,0.474] (0.474,0.687]
[33] (0.687,0.9] (0.9,1.11] (1.11,1.33] (1.33,1.54]
[37] (1.54,1.75] (1.75,1.96] (1.96,2.18] (2.18,2.39]
[41] (2.39,2.6] (2.6,2.82] (2.82,3.03] (3.03,3.24]
[45] (3.24,3.46] (3.46,3.67] (3.67,3.88] (3.88,4.1]
[49] (4.1,4.31] (4.31,4.52] (4.52,4.73] (4.73,4.95]
[53] (4.95,5.16] (5.16,5.37] (5.37,5.59] (5.59,5.8]
[57] (5.8,6.01] (6.01,6.23] (0.0411,0.261] (0.261,0.474]
[61] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[65] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[69] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[73] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[77] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[81] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[85] (5.59,5.8] (5.8,6.01] (6.01,6.23] (0.0411,0.261]
[89] (0.261,0.474] (0.474,0.687] (0.687,0.9] (0.9,1.11]
[93] (1.11,1.33] (1.33,1.54] (1.54,1.75] (1.75,1.96]
[97] (1.96,2.18] (2.18,2.39] (2.39,2.6] (2.6,2.82]
[101] (2.82,3.03] (3.03,3.24] (3.24,3.46] (3.46,3.67]
[105] (3.67,3.88] (3.88,4.1] (4.1,4.31] (4.31,4.52]
[109] (4.52,4.73] (4.73,4.95] (4.95,5.16] (5.16,5.37]
[113] (5.37,5.59] (5.59,5.8] (5.8,6.01] (6.01,6.23]
[117] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[121] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[125] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[129] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[133] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[137] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[141] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[145] (6.01,6.23] (0.0411,0.261] (0.261,0.474] (0.474,0.687]
[149] (0.687,0.9] (0.9,1.11] (1.11,1.33] (1.33,1.54]
[153] (1.54,1.75] (1.75,1.96] (1.96,2.18] (2.18,2.39]
[157] (2.39,2.6] (2.6,2.82] (2.82,3.03] (3.03,3.24]
[161] (3.24,3.46] (3.46,3.67] (3.67,3.88] (3.88,4.1]
[165] (4.1,4.31] (4.31,4.52] (4.52,4.73] (4.73,4.95]
[169] (4.95,5.16] (5.16,5.37] (5.37,5.59] (5.59,5.8]
[173] (5.8,6.01] (6.01,6.23] (0.0411,0.261] (0.261,0.474]
[177] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[181] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[185] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[189] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[193] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[197] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[201] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[205] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[209] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[213] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[217] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[221] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[225] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[229] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[233] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[237] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[241] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[245] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[249] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[253] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[257] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[261] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[265] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[269] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[273] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[277] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[281] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[285] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[289] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[293] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[297] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[301] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[305] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[309] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[313] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[317] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[321] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[325] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[329] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[333] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[337] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[341] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[345] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[349] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[353] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[357] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[361] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[365] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[369] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[373] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[377] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[381] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[385] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[389] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[393] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[397] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[401] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[405] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[409] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[413] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[417] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[421] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[425] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[429] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[433] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[437] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[441] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[445] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[449] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[453] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[457] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[461] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[465] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[469] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[473] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[477] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[481] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[485] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[489] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[493] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[497] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[501] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[505] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[509] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[513] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[517] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[521] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[525] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[529] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[533] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[537] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[541] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[545] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[549] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[553] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[557] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[561] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[565] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[569] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[573] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[577] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[581] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[585] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[589] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[593] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[597] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[601] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[605] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[609] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[613] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[617] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[621] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[625] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[629] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[633] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[637] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[641] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[645] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[649] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[653] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[657] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[661] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[665] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[669] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[673] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[677] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[681] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[685] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[689] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[693] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[697] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[701] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[705] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[709] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[713] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[717] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[721] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[725] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[729] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[733] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[737] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[741] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[745] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[749] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[753] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[757] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[761] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[765] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[769] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[773] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[777] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[781] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[785] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[789] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[793] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[797] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[801] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[805] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[809] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[813] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[817] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[821] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[825] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[829] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[833] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[837] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[841] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[845] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[849] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[853] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[857] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[861] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[865] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[869] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[873] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[877] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[881] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[885] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[889] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[893] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[897] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[901] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[905] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[909] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[913] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[917] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[921] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[925] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[929] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[933] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[937] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[941] (3.46,3.67] (3.67,3.88] (3.88,4.1] (4.1,4.31]
[945] (4.31,4.52] (4.52,4.73] (4.73,4.95] (4.95,5.16]
[949] (5.16,5.37] (5.37,5.59] (5.59,5.8] (5.8,6.01]
[953] (6.01,6.23] (6.23,6.44] (0.0411,0.261] (0.261,0.474]
[957] (0.474,0.687] (0.687,0.9] (0.9,1.11] (1.11,1.33]
[961] (1.33,1.54] (1.54,1.75] (1.75,1.96] (1.96,2.18]
[965] (2.18,2.39] (2.39,2.6] (2.6,2.82] (2.82,3.03]
[969] (3.03,3.24] (3.24,3.46] (3.46,3.67] (3.67,3.88]
[973] (3.88,4.1] (4.1,4.31] (4.31,4.52] (4.52,4.73]
[977] (4.73,4.95] (4.95,5.16] (5.16,5.37] (5.37,5.59]
[981] (5.59,5.8] (5.8,6.01] (6.01,6.23] (6.23,6.44]
[985] (0.0411,0.261] (0.261,0.474] (0.474,0.687] (0.687,0.9]
[989] (0.9,1.11] (1.11,1.33] (1.33,1.54] (1.54,1.75]
[993] (1.75,1.96] (1.96,2.18] (2.18,2.39] (2.39,2.6]
[997] (2.6,2.82] (2.82,3.03] (3.03,3.24] (3.24,3.46]
[ reached getOption("max.print") -- omitted 86529 entries ]
30 Levels: (0.0411,0.261] (0.261,0.474] (0.474,0.687] ... (6.23,6.44]
# check
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(ground_arousal_lab))%>%
ggplot(aes(x = timerezero3, y = pup_basCor))+
stat_smooth(aes(group= ground_arousal_lab, color = ground_arousal_lab), fun = mean,geom = "line",
se = F, alpha = .1, size = 1.5)+
stat_smooth(aes(group=ground_arousal_lab, color = ground_arousal_lab), size = 3)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
xlim(0,6)+
facet_grid(~mediansplit_self_valence)
Ignoring unknown parameters: fun

pupil timecourse
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(mediansplit_sample_arousal2))%>%
subset(!is.na(mediansplit_sample_arousal2))%>%
ggplot(aes(x = timerezero3, y = pup_basCor))+
stat_smooth(aes(group= mediansplit_sample_valence2, color = mediansplit_sample_valence2), fun = mean,geom = "line",
se = F, alpha = .1, size = 1.5)+
stat_smooth(aes(group=mediansplit_sample_valence2, color = mediansplit_sample_valence2), size = 3)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
xlim(0,6)+
facet_grid(~mediansplit_sample_arousal2)
Ignoring unknown parameters: fun

unique(tmp.df4_full_stim_downs_jun2021_with_beh$condition)
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(mediansplit_sample_arousal2))%>%
subset(valencearousal_outliers == TRUE) %>%
# subset(!is.na(mediansplit_sample_arousal2))%>%
ggplot(aes(x = timerezero3, y = pup_basCor))+
stat_smooth(aes(group= mediansplit_sample_arousal2, color = mediansplit_sample_arousal2), fun = mean,geom = "line",
se = F, alpha = .1, size = 1.5)+
stat_smooth(aes(group=mediansplit_sample_arousal2, color = mediansplit_sample_arousal2), size = 3)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
xlim(0,6)+
facet_grid(mediansplit_sample_valence2~.)+
geom_hline(yintercept = 0)
Ignoring unknown parameters: fun

unique(tmp.df4_full_stim_downs_jun2021_with_beh$timebin2) # 30 time bins

timecourse analyss using lmer
1- select a bin 2 - fit a lmer 3 - save statistics (estimate and p value) 3 - create clusters (p value < .05 in at least 3 consecutive bins)
tmp.df4_full_stim_downs_jun2021_with_behnew$
i = 1
nbins<- unique(tmp.df4_full_stim_downs_jun2021_with_behnew$timebin2)
tmp.df4_full_stim_downs_jun2021_with_behnew
unique(tmp.df4_full_stim_downs_jun2021_with_behnew$timebin2)
lmer_bin_pup<- list()
# <- nrow(nbins)
nbins<- unique(tmp.df4_full_stim_downs_jun2021_with_behnew$timebin2)
tmp.df4_full_stim_downs_jun2021_with_behnew$Label<- substr(tmp.df4_full_stim_downs_jun2021_with_behnew$stimIAPS, 1,8)
imageJ_IAPS$Label
nrow(tmp.df4_full_stim_downs_jun2021_with_behnew)
# 62921
nrow(left_join(tmp.df4_full_stim_downs_jun2021_with_behnew, imageJ_IAPS))
tmp.df4_full_stim_downs_jun2021_with_behnew<- left_join(tmp.df4_full_stim_downs_jun2021_with_behnew, imageJ_IAPS)
tmp.df4_full_stim_downs_jun2021_with_behnew$Mean_gray_z<- scale(tmp.df4_full_stim_downs_jun2021_with_behnew$Mean, scale = TRUE, center = TRUE)[,1]
test<- lmer(pup_basCor ~ arousal_c+Mean_gray_z +(1 +Mean_gray_z | ssid),
REML = FALSE,
data = subset(tmp.df4_full_stim_downs_jun2021_with_behnew,
timebin2 == nbins[b]))
summary(test)
tmp.df4_full_stim_downs_jun2021_with_behnew$tNo
"(0.0411,0.261]"
subset(tmp.df4_full_stim_downs_jun2021_with_behnew,
timebin2 == nbins[28] & ssid == 341 & tNo == 3)
test
rm(i)
i = 1 # remember to always rezero it
# b = 34
nbins<- nbins[1:28]
unique(nbins)
# nbins<- as
# positive
# create number s for time bins
tmp.df4_full_stim_downs_jun2021_with_behnew<- tmp.df4_full_stim_downs_jun2021_with_behnew%>%
group_by(ssid, stimIAPS)%>%
mutate(timebin_no = 1:n())
tmp.df4_full_stim_downs_jun2021_with_behnew%>%
# group_by(ssid, stimIAPS)
ggplot(aes(timebin_no))+
geom_histogram()+
geom_vline(xintercept = 28)+
geom_hline(yintercept = 200)

negative lmer

timecourse_result_df$Valence <- "More negative"
timecourse_result_df_neg$Valence<- "More positive"
bind_rows(timecourse_result_df,timecourse_result_df_neg)%>%
ggplot(aes(timebins, t, color = Valence))+
geom_line(size = 2)+
geom_line(aes(y = p), linetype = "dashed", size = 2)+
geom_hline(yintercept = .05, color = 'red', size = 1.5)
use valence to pupil

use valence to pupil

valence for high vs low


velocity analyses

Velocity by valence

Negative velocity

A few plots for velocity

tmp.df4_full_stim_downs_jun2021_with_behnew%>%
group_by(mediansplit_self_valence, timebin2)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(timerezero3, cor_arous_pup, color = mediansplit_self_valence))+
# geom_s
stat_summary(fun = mean, geom = 'pointrange')+
stat_summary(aes(y = cor_arous_pup_pval), fun = mean, geom = 'line', linetype = "dashed")+
geom_hline(yintercept = .1, linetype = "dashed")
geom_rect(aes(xmin = timerezero3, xmax = dplyr::lead(timerezero3), ymin =.63 , ymax =.66 , fill = pval_sign),
alpha = 0.8)
# stat_smooth(aes(group = ssid), se = F, alpha = .1)
# mutate(
# model = map(data, ~lm(pup_basCor ~ arousal_c, data = .)),
# cor = map(data, possibly(
# ~tidy(cor.test(.x$pup_basCor, .x$arousal_c), 3), otherwise = data.frame())
# )
# )
self arousal
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(ground_arousal_lab))%>%
ggplot(aes(x = timerezero3, y = pup_basCor))+
stat_smooth(aes(group= ground_arousal_lab, color = ground_arousal_lab), fun = mean,geom = "line",
se = F, alpha = .1, size = 1.5)+
stat_smooth(aes(group=ground_arousal_lab, color = ground_arousal_lab), size = 3)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
xlim(0,6)+
facet_grid(~mediansplit_self_valence)
# plot with valence
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(ground_arousal_lab))%>%
group_by(ssid,Alexithymia, mediansplit_ground_valence, timebin2)%>%
ggplot(aes(x = timerezero3, y = pup_basCor))+
stat_smooth(aes(group= mediansplit_ground_valence, color = mediansplit_ground_valence), fun = mean,geom = "line",
se = F, size = 1.5)+
# stat_smooth(aes(group=ground_valence_lab, color = ground_valence_lab), size = 3)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
xlim(0,6)
test<- cor.test(db_2021_pupil_summ$hr_interp,db_2021_pupil_summ$pup_basCor)
test$p.value
tmp.df4_full_stim_downs_jun2021_with_beh$ssid_ground_valence<- paste0(tmp.df4_full_stim_downs_jun2021_with_beh$ssid, paste0(tmp.df4_full_stim_downs_jun2021_with_beh$ground_arousal_lab))
tmp.df4_full_stim_downs_jun2021_with_beh %>%
subset(!is.na(self_arousal_lab))%>%
db_full4new_stim_screen_pupil_nopract
group_by(ssid,Alexithymia, ground_valence_lab, timebin2)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor)$estimate)%>%
mutate(pcortest = cor.test(arousal_c, pup_basCor)$p.value)%>%
group_by(ssid,Alexithymia, self_arousal_lab, timebin2)%>%
summarise_if(is.numeric, mean, na.rm = TRUE) %>%
ggplot(aes(x = timerezero3, y = cortest))+
stat_smooth(aes(group= self_arousal_lab, color = self_arousal_lab), fun = mean,geom = "line",
se = F, size = 1.5)+
theme_classic()+
ylab("Pupil size (z)")+
xlab("Time (s)")+
# p$graphstyle+
scale_color_brewer(palette = "Dark2")+
geom_hline(yintercept = .05, linetype = "dashed")+
xlim(0,6)
# does arousing stimuli impairs appraisal
tmp.df4_full_stim_downs_jun2021_with_beh %>%
ggplot(aes(ground_arousal_lab, BRIGHTNESS))+
geom_boxplot()+
geom_point()+
# stat_summary(geom = 'boxplot')+
facet_grid(~mediansplit_self_valence)
db_full4new_stim_screen_pupil_nopract %>%
subset(pupil_outlier == FALSE & arousal_outler == FALSE & !is.na(Alexithymia) & ssid!= 610)%>%
# group_by(ssid,Alexithymia, is_valence_high)%>%
group_by(ssid,Alexithymia, mediansplit_self_valence)%>%
mutate(cortest = cor.test(arousal_c, pup_basCor)$estimate)%>%
group_by(ssid,Alexithymia, mediansplit_self_valence, self_arousal_lab)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_self_valence, cortest, color = mediansplit_self_valence))+
geom_bar(stat="summary", fun.y = "mean")+
geom_jitter(width = .1, alpha = .1)+
stat_summary( geom = 'pointrange')+
# stat_summary(aes(group = ssid), geom = 'line')+
ylab("R pupil vs self report arousal")+
# ggpubr::stat_compare_means(paired = TRUE)+
# ggpubr::stat_compare_means(comparisons = my_comparisons, paired = TRUE)
facet_grid(~self_arousal_lab)
SCR
unique(db_full4new_stim_screen_pupil_nopract$ssid)
View(flag_pos_neg)
db_full4new_stim_screen_pupil_nopract$mediansplit_self_arousal <- if_else(db_full4new_stim_screen_pupil_nopract$arousal> median(db_full4new_stim_screen_pupil_nopract$arousal, na.rm = TRUE), "High", "Low")
db_full4new_stim_screen_pupil_nopract$mediansplit_self_arousal_thissample <- if_else(db_full4new_stim_screen_pupil_nopract$arousal> median(db_full4new_stim_screen_pupil_nopract$ArousalMeanThisSample, na.rm = TRUE), "High", "Low")
unique(db_full4new_stim_screen_pupil_nopract2$ssid)
db_full4new_stim_screen_pupil_nopract_nt<- subset(db_full4new_stim_screen_pupil_nopract, ssid_num<500)
nrow(db_full4new_stim_screen_pupil_nopract_nt)
# 2233
# nrow(left_join(db_full4new_stim_screen_pupil_nopract_nt, flag_pos_neg))
db_full4new_stim_screen_pupil_nopract_nt<- left_join(db_full4new_stim_screen_pupil_nopract_nt, flag_pos_neg)
unique(db_full4new_stim_screen_pupil_nopract_nt$stimDescription)
db_full4new_stim_screen_pupil_nopract_nt %>%
subset(ssid_num< 500)%>%
subset(pp_arousal_outler == FALSE)%>%
subset( arousal_outler == FALSE )%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid)%>%
mutate(BIO_CDA.SCR_z = scale((BIO_CDA.SCR))[,1])%>%
ungroup()%>%
group_by(ssid,cor_pos_neg_diff_lab, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_self_valence, BIO_CDA.SCR_z))+
stat_summary(geom = 'pointrange')+
# geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
geom_jitter(width = .2, alpha = .2)+
stat_summary(aes(group = ssid), geom = 'line', color = "gray", alpha = .1)+
# geom_boxplot(alpha = .1)+
# facet_grid(~cor_pos_neg_diff_lab)+
ggpubr::stat_compare_means()
BIO_CDA.ISCR_z
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid)%>%
mutate(BIO_TTP.AmpSum_z = scale(BIO_TTP.AmpSum, center = TRUE, scale = TRUE)[,1])%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, BIO_TTP.AmpSum_z))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid,mediansplit_sample_valence2)%>%
# mutate(BIO_TTP.AmpSum_z = scale(BIO_TTP.AmpSum, center = TRUE, scale = TRUE)[,1])%>%
# summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal, BIO_CDA.ISCR_z))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
facet_grid(~mediansplit_sample_valence2)
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid,mediansplit_sample_valence2)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, BIO_CDA.PhasicMax_z, color =mediansplit_sample_valence2))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid,ground_arousal_lab)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal_c, BIO_CDA.PhasicMax_z, color =ground_arousal_lab))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
scr model
unique(db_full4new_stim_screen_pupil_nopract_nt$condition)
pupil_arousal_findings$arousal_scr <- lmer(log(BIO_CDA.SCR+.1) ~ arousal_c*TASc +(1|ssid) + (1|stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt,
pp_arousal_outler == FALSE &
mediansplit_self_valence == "More positive"))
summary(pupil_arousal_findings$arousal_scr)
anova(pupil_arousal_findings$arousal_phas_max)
BIO_CDA.PhasicMax
pupil_arousal_findings$arousal_scr <- lmer(BIO_CDA.PhasicMax_z ~ valence_c +(1+arousal_c|ssid),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt,
pp_arousal_outler == FALSE))
# mediansplit_self_valence == "More positive"))
summary(pupil_arousal_findings$arousal_scr)
anova(pupil_arousal_findings$arousal_phas_max)
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid, cor_pos_neg_diff_lab)%>%
ggplot(aes(cor_pos_neg_diff_lab, TAS))+
geom_point()+
stat_summary(geom = 'pointrange')
summary(pupil_arousal_findings\(arousal_scr) anova(pupil_arousal_findings\)arousal_phas_max)
test<- subset(db_full4new_stim_screen_pupil_nopract, pp_arousal_outler == FALSE & ssid == 310) test\(Alexithymia table(test\)mediansplit_self_valence)
try the anova grouping
afex::aov_ez(data = (db_full4new_stim_screen_pupil_nopract %>%
subset(pp_arousal_outler == FALSE)%>%
# subset(is_scr_nonresponder == FALSE )%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid, mediansplit_ground_valence)%>%
# group_by(ssid, Alexithymia,mediansplit_self_arousal, mediansplit_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)),
id = "ssid",
between = NULL,
within = c("mediansplit_ground_valence"),
dv = "BIO_CDA.SCR_z")
colnames(db_full4new_stim_screen_pupil_nopract)
ggcorrplot::ggcorrplot(cor(db_full4new_stim_screen_pupil_nopract[,c(19,115,125:128,27,26)], use = "complete"))
BIO_CDA.SCR_z
indovidual plots
facet_hist_scr<- db_full4new_stim_screen_pupil_nopract %>%
subset(ssid > 303)%>%
subset(arousal_outler == FALSE )%>%
subset(!is.na(Alexithymia))%>%
ggplot(aes(log1p(BIO_CDA.SCR+1)))+
geom_histogram(bins = )+
facet_wrap(~ssid)
what’s up with non responders
312
318 only one rspinse?
320
321
327
329
332
335 (only one response)
342
343
600
603
606 (only one response)
608
900
56- 15
that would leave us with 41 people
unique(db_full4new_stim_screen_pupil_nopract$ssid)
range(db_full4new_stim_screen_pupil_nopract$BIO_CDA.SCR, na.rm = TRUE)
mean(db_full4new_stim_screen_pupil_nopract$BIO_CDA.SCR, na.rm = TRUE)
sd(db_full4new_stim_screen_pupil_nopract$BIO_CDA.SCR, na.rm = TRUE)
db_full4new_stim_screen_pupil_nopract%>%
ggplot(aes(BIO_CDA.SCR))+
geom_histogram(bins = 500)
xlim(0,.01)
db_full4new_stim_screen_pupil_nopract%>%
subset(ssid == 312)%>%
ggplot(aes(BIO_CDA.AmpSum))+
geom_histogram(bins = 500)+
xlim(0,.05)
db_full4new_stim_screen_pupil_nopract$is_scr_nonresponder<- if_else(db_full4new_stim_screen_pupil_nopract$BIO_CDA.AmpSum< .1, TRUE, FALSE)
db_full4new_stim_screen_pupil_nopract %>%
subset(ssid > 303)%>%
subset(arousal_outler == FALSE )%>%
subset(!is.na(Alexithymia))%>%
ggplot(aes(log1p(BIO_CDA.SCR+1)))+
geom_histogram(bins = )+
facet_grid(~is_scr_nonresponder)
facet_wrap(~ssid)
db_full4new_stim_screen_pupil_nopract%>%
group_by(ssid,is_scr_nonresponder)%>%
mutate(scr_nonresp_prop = n())%>%
group_by(ssid)%>%
mutate(scr_nonresp_prop = scr_nonresp_prop/n())%>%
ggplot(aes(as.factor(ssid), scr_nonresp_prop))+
geom_bar(stat="summary", fun.y = "mean", alpha = .2, width = .5)
# test<- subset(db_full4new_stim_screen_pupil_nopract, ssid == 321)
table(db_full4new_stim_screen_pupil_nopract_nt$is_scr_nonresponder)
db_full4new_stim_screen_pupil_nopract_nt %>%
subset(is_scr_nonresponder != FALSE)%>%
subset(pp_arousal_outler == FALSE)%>%
subset(!ssid %in% c("304","321", "323", "318","339","331","325"))%>%
# subset( arousal_outler == FALSE )%>%
subset(!is.na(Alexithymia))%>%
group_by(ssid)%>%
mutate(BIO_CDA.SCR_z = scale(log1p(BIO_CDA.PhasicMax +.1))[,1])%>%
# ungroup()%>%
group_by(ssid, Alexithymia,mediansplit_sample_arousal2, mediansplit_sample_valence2)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
# group_by(ssid)%>%
# mutate(SCR_trend = BIO_CDA.SCR_z[mediansplit_ground_arousal == "Higher arousal"] -
# BIO_CDA.SCR_z[mediansplit_ground_arousal == "Lower arousal"])
# mutate(trendscr = if_else(SCR_trend> 0, "high to high", "high to low"))
# group_by(ssid, Alexithymia,mediansplit_ground_arousal,trendscr)%>%
# summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_sample_arousal2, BIO_CDA.SCR_z))+
stat_summary(geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line')+
# geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
geom_jitter(width = .2, alpha = .2)
facet_grid(~mediansplit_sample_valence2)
# geom_boxplot(alpha = .1)
# geom_text(aes(label = ssid))
facet_grid(~trendscr)
# ylim(-1,1)
304, 318, 339, 331,325
scr_models<- list()
db_full4new_stim_screen_pupil_nopract_nt %>%
subset(is_scr_nonresponder == FALSE)%>%
subset(pp_arousal_outler == FALSE)%>%
subset(!ssid %in% c("304","321", "323", "318","339","331","325"))
# subset( arousal_outler == FALSE )%>%
db_full4new_stim_screen_pupil_nopract_nt_scr_excluding_atypical<- db_full4new_stim_screen_pupil_nopract_nt%>%
subset(!ssid %in% c("304","321", "323", "318","339","331","325"))
# subset(is_scr_nonresponder == FALSE)%>%
group_by(ssid)%>%
mutate(BIO_CDA.PhasicMax_z = scale(BIO_CDA.PhasicMax, center = TRUE, scale = TRUE)[,1])%>%
mutate(valence_z = scale(valence, center = TRUE, scale = TRUE)[,1])%>%
mutate(arousal_z = scale(arousal, center = TRUE, scale = TRUE)[,1])
scr_models$scr_excluding_atypical<- lmer(log(BIO_CDA.PhasicMax+.1) ~ valence_z + arousal_z+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = db_full4new_stim_screen_pupil_nopract_nt_scr_excluding_atypical)
scr_models$scr_excluding_atypical<- lmer(log(BIO_CDA.PhasicMax+.1) ~ valence_c + arousal_c+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = db_full4new_stim_screen_pupil_nopract_nt)
# subset(!ssid %in% c("304","321", "323", "318","339","331","325"))%>%
subset(is_scr_nonresponder != FALSE))
summary(scr_models$scr_excluding_atypical)
(db_full4new_stim_screen_pupil_nopract_nt%>%
subset(!ssid %in% c("304","321", "323", "318","339","331","325"))))
summary(scr_models$scr_excluding_atypical)
db_full4new_stim_screen_pupil_nopract %>%
subset(is_scr_nonresponder == FALSE)%>%
subset(pp_arousal_outler == FALSE)%>%
subset( arousal_outler == FALSE )%>% subset(!is.na(Alexithymia))%>% group_by(ssid)%>% mutate(BIO_CDA.SCR_z = scale(log1p(BIO_CDA.PhasicMax +.1))[,1])%>% mutate(arousal_z = scale(arousal +.1))%>% ungroup()%>% # group_by(ssid, Alexithymia,mediansplit_self_arousal)%>% # summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(arousal_z, BIO_CDA.SCR_z))+ geom_point()+ # geom_smooth(aes(group = ssid),method = ‘lm’, se = F)+ geom_smooth(method = ‘lm’, se = F)+ facet_grid(~ground_arousal_lab)
# geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
geom_jitter(width = .2, alpha = .2)+ ylim(-1,1)
# panel for many folks db_full4new_stim_screen_pupil_nopract %>% # subset(ssid == 314)%>% group_by(ssid)%>% mutate(BIO_CDA.SCR_z = scale(log1p(BIO_CDA.PhasicMax +.1))[,1])%>% mutate(arousal_z = scale(arousal +.1))%>% ggplot(aes(arousal_z,BIO_CDA.SCR_z, color =mediansplit_ground_valence , shape =mediansplit_ground_arousal))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ facet_wrap(~ssid)+ ggpubr::stat_cor()
db_full4new_stim_screen_pupil_nopract %>%
# subset(ssid == 314)%>% group_by(ssid)%>% mutate(BIO_CDA.SCR_z = scale(log1p(BIO_CDA.PhasicMax +.1))[,1])%>% mutate(arousal_z = scale(arousal +.1))%>% ggplot(aes(pup_basCor,BIO_CDA.SCR_z))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ facet_wrap(~ssid)+ ggpubr::stat_cor()
db_full %>%
# subset(ssid == 314)%>% group_by(ssid)%>% mutate(BIO_Mean_HR = scale(BIO_Mean_HR, scale = FALSE)[,1])%>% mutate(arousal_z = scale(arousal +.1))%>% ggplot(aes(BIO_Mean_HR,log1p(BIO_CDA.PhasicMax+.1)))+ geom_point()+ geom_smooth(aes(group = ssid),method = ‘lm’, se = F) facet_wrap(~ssid)+ ggpubr::stat_cor()
Let’s try some 3 d visualisations continue here
db_full4new_stim_screen_pupil_nopract_nt %>%
group_by(ssid, mediansplit_ground_arousal, mediansplit_ground_valence,scr_utl)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
subset(scr_utl == "notoutlier")%>%
ggplot(aes(mediansplit_ground_arousal , BIO_CDA.PhasicMax_z))+
geom_jitter(alpha = .1, width = .1)+
stat_summary(geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = "line", alpha = .1)+
facet_grid(~mediansplit_ground_valence)
db_full4new_stim_screen_pupil_nopract_nt%>%
ggplot(aes(BIO_CDA.PhasicMax_z))+
geom_histogram()
db_full4new_stim_screen_pupil_nopract_nt<- db_full4new_stim_screen_pupil_nopract_nt%>%
mutate(scr_utl = if_else(BIO_CDA.PhasicMax_z > 5, "outlier", "notoutlier"))
# + arousal_c
scr_models$scr_excluding_atypical<- lmer(log(BIO_CDA.AmpSum_collapsed+.1) ~ arousal_c*valence_c * TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, scr_utl == "notoutlier"))
summary(scr_models$scr_excluding_atypical)
plot(scr_models$scr_excluding_atypical)
interactions::interact_plot(scr_models$scr_excluding_atypical, pred = arousal_c, modx = valence_c, mod2 = TASc)
db_full4new_stim_screen_pupil_nopract_nt%>%
ggplot(aes())
scr_models$scr1<- lmer(log(BIO_CDA.PhasicMax_collapsed+.1) ~ arousal_c*valence_c * TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, scr_utl == "notoutlier"))
summary(scr_models$scr1)
scr_models$scr1.2<- lmer(log1p(BIO_CDA.PhasicMax+.1) ~ TASc*arousal_c * valence_c+
(1 | ssid)+
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, Group == "NT", !is.na(Alexithymia)))
unique(db_full4new_stim_screen_pupil_nopract$ssid)
summary(scr_models$scr1.2)
db_full4new_stim_screen_pupil_nopract %>%
group_by(ssid,Group)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
subset(Group == "NT")%>%
ggplot(aes(TAS))+
geom_histogram()
interactions::interact_plot(scr_models$scr1, pred = arousal_c, modx = valence_c, mod2 = TASc)
scr_models$scr1.1<- lmer(CDA.PhasicMax ~ arousal_c*valence_c * TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, scr_utl == "notoutlier"))
summary(scr_models$scr1.1)
interactions::interact_plot(scr_models$scr1.1, pred = arousal_c, modx = valence_c, mod2 = TASc)
scr_models$scr2<- lmer(BIO_CDA.ISCR_collapsed ~ arousal_c*valence_c *TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, scr_utl == "notoutlier"))
summary(scr_models$scr2)
interactions::interact_plot(scr_models$scr2, pred = arousal_c, modx = valence_c)
scr_models$scr2<- lmer(BIO_CDA.SCR_collapsed ~ arousal_c* valence_c *TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract, Group = "NT"))
summary(scr_models$scr2)
interactions::interact_plot(scr_models$scr2, pred = arousal_c, modx = valence_c)
# the effect of pupil is the opposite on scr
scr_models$scr3<- lmer(BIO_CDA.ISCR_collapsed ~ arousal_c * valence_c * TASc+
(1| ssid) +
(1 | stimIAPS),
REML = FALSE,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, scr_utl == "notoutlier"))
summary(scr_models$scr3)
interactions::interact_plot(scr_models$scr2, pred = arousal_c, modx = valence_c, mod2 = TASc)
# the effect of pupil is the opposite on scr
check scr on within individuals
lm_objtest<- lm(BIO_CDA.PhasicMax_z ~ arousal * valence, data = db_full4new_stim_screen_pupil_nopract_nt)
lm_objtest_summ<-summary(lm_objtest)
lm_objtest_summ$coefficients
db_full4new_stim_screen_pupil_nopract_nt
lm_objtest[["coefficients"]][[2]]
lm_objtest[["coefficients"]][["arousal"]]
lm_objtest[["coefficients"]][["valence"]]
regression_df <- data.frame(ssid= rep(NA, 50), Estimate_arousal= rep(NA, 50),
Estimate_valence= rep(NA, 50),
Estimate_int= rep(NA, 50),
p_arousal= rep(NA, 50),
p_valence= rep(NA, 50),
p_int= rep(NA, 50))
lm_ind_summary$coefficients[[14]]
ssid<- unique(db_full4new_stim_screen_pupil_nopract_nt$ssid)
db_full4new_stim_screen_pupil_nopract_nt<- db_full4new_stim_screen_pupil_nopract_nt%>%
group_by(ssid)%>%
mutate(arousal_z_ssid = scale(arousal - mean(arousal, na.rm = TRUE))[,1],
valence_z_ssid = scale(valence - mean(valence, na.rm = TRUE))[,1])
i = 1
rm(b)
# debug
ssid_tes<- unique(db_full4new_stim_screen_pupil_nopract_nt$ssid_num)
table(is.na(db_full4new_stim_screen_pupil_nopract_nt$BIO_CDA.PhasicMax_z))
lm_ind <- lm(BIO_CDA.PhasicMax_z ~ arousal_z_ssid *valence_z_ssid,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, !is.na(BIO_CDA.PhasicMax_z) &
ssid_num == ssid_tes[10]))
subset(db_full4new_stim_screen_pupil_nopract_nt, !is.na(BIO_CDA.PhasicMax_z) &
ssid_num == ssid_tes[10])
i = 1
rm(b)
for (b in 5:length(ssid_tes)) {
# for (s in 1:length(nsim)) {
message(sprintf("$$$$$RUNING lmer for ssid %i", ssid_tes[b]))
# db_of7_new_JEFFE$VideoType_contrast_sample<- sample((rep(c(-.5, .5), each = 1920)), replace = FALSE)
#run the model on the current time bin and simulation sumber
lm_ind <- lm(BIO_CDA.PhasicMax_z ~ arousal_z_ssid *valence_z_ssid,
data = subset(db_full4new_stim_screen_pupil_nopract_nt, !is.na(BIO_CDA.PhasicMax_z) &
mediansplit_ground_valence == "More negative"&
ssid_num == ssid_tes[b]))
#store results from the simulation
lm_ind_summary<- summary(lm_ind)
regression_df[i,1]<- ssid_tes[b] #save ssid
regression_df[i,2]<- lm_ind_summary$coefficients[[2]] # arousal beta
regression_df[i,3]<-lm_ind_summary$coefficients[[3]] # valence beta
regression_df[i,4]<-lm_ind_summary$coefficients[[4]] # inyteraction beta
regression_df[i,4]<-lm_ind_summary$coefficients[[4]]
regression_df[i,5]<- lm_ind_summary$coefficients[[14]]
regression_df[i,6]<- lm_ind_summary$coefficients[[15]]
regression_df[i,7]<- lm_ind_summary$coefficients[[16]]
lm_ind_summary$coefficients[[14]]
# simulated_clusters_JEFFE[i,6]<- nsim[s] #store simulation ount
# timecourse_result_df_neg[i,5] <-ifelse(length(lmer_bin_pup_summary$optinfo$conv$lme4$message)
# != 0,
# lmer_bin_pup_summary$optinfo$conv$lme4$message, 'pass')
i = i+1
}
View(regression_df)
lm_ind_summary$coefficients[[4]]
# whether I use ground valence, self valemce or this sample average valence, I get the same patterns
timecourse_result_df_neg%>%
ggplot(aes(timebins, t))+
geom_line(size = 2)+
geom_line(aes(y = p), linetype = "dashed", size = 2)+
geom_hline(yintercept = .1, color = 'red', size = 1.5)
t.test(regression_df$Estimate_arousal)
ssid# just positive
regression_df <- data.frame(ssid= rep(NA, 50), Estimate_arousal= rep(NA, 50),
Estimate_valence= rep(NA, 50),
Estimate_int= rep(NA, 50),
p_arousal= rep(NA, 50),
p_valence= rep(NA, 50),
p_int= rep(NA, 50))
scatter3D(x, y, z, clab = c("Sepal", "Width (cm)"))
db_full4new_stim_screen_pupil_nopract_nt
install.packages("plot3D")
install.packages("misc3d")
library(misc)
plot3D::scatter3D(db_full4new_stim_screen_pupil_nopract_nt$pup_basCor,
db_full4new_stim_screen_pupil_nopract_nt$arousal_c,
db_full4new_stim_screen_pupil_nopract_nt$valence_c)
install.packages("plot3D", dependencies = TRUE)
install.packages("misc3d", repo = 'https://mac.R-project.org')
install.packages(c("rgl", "car"))
library(car)
install.packages("car", dependencies = TRUE)
car::scatter3d(db_full4new_stim_screen_pupil_nopract_nt$arousal_c,
db_full4new_stim_screen_pupil_nopract_nt$pup_basCor,
db_full4new_stim_screen_pupil_nopract_nt$valence_c,
fit = "smooth"
# point = FALSE,
# surface = FALSE,
# point.col = ""
)
gg = ggplot(db_full4new_stim_screen_pupil_nopract_nt, aes(BIO_CDA.PhasicMax_z, arousal_c)) + stat_density_2d(aes(fill = stat(db_full4new_stim_screen_pupil_nopract_nt$valence_c)), geom = “polygon”, n = 100,bins = 10,contour = TRUE) + # facet_wrap(clarity~.) + scale_fill_viridis_c(option = “A”)
rayshader::plot_gg(gg,multicore=TRUE,width=5,height=5,scale=250)
scr<- db_full4new_stim_screen_pupil_nopract_nt\(BIO_CDA.PhasicMax_z arousal<- db_full4new_stim_screen_pupil_nopract_nt\)arousal_c
valence = db_full4new_stim_screen_pupil_nopract_nt$valence_c
gg = ggplot(db_full4new_stim_screen_pupil_nopract_nt, aes(BIO_CDA.PhasicMax_z, arousal_c)) + stat_density_2d(aes(fill = stat(valence_c)), geom = “polygon”, # n = 100,bins = 10, contour = TRUE) + # facet_wrap(clarity~.) + scale_fill_viridis_c(option = “A”) rayshader::plot_gg(gg,multicore=TRUE,width=5,height=5,scale=250) gg #No lines pp_nolines = ggplot(db_full4new_stim_screen_pupil_nopract_nt, aes(x=BIO_CDA.PhasicMax_z, y=arousal_c)) + geom_point(aes(color = valence_c)) scale_fill_viridis_c(a)
rayshader::plot_gg(pp_nolines, width = 4, height = 4, scale = 300, multicore = TRUE) pp_nolines
?scatter3d scatter3d(x = arousal, y = valence, z = scr, fit = “smooth”,
# surface = FALSE,
point.col = "blue",
# point
groups = as.factor(db_full4new_stim_screen_pupil_nopract_nt$mediansplit_sample_valence2),
ellipsoid = FALSE)
scatter3d(x = db_full4new_stim_screen_pupil_nopract_nt\(pup_basCor, y = db_full4new_stim_screen_pupil_nopract_nt\)BIO_CDA.PhasicMax_z, z = db_full4new_stim_screen_pupil_nopract_nt, fit = “smooth”,
# surface = FALSE,
point.col = "blue",
# point
groups = as.factor(db_full4new_stim_screen_pupil_nopract_nt$mediansplit_ground_valence),
ellipsoid = FALSE)
library(viridisLite) install.packages(“viridis”) library(viridis) deathgg = ggplot(db_full4new_stim_screen_pupil_nopract_nt) + geom_tile(aes(x=arousal_c,y=pup_basCor,fill=valence_c))+ # scale_x_continuous(“Year”,expand=c(0,0),breaks=seq(1900,2010,10)) + # scale_y_continuous(“Age”,expand=c(0,0),breaks=seq(0,100,10),limits=c(0,100)) + scale_fill_viridis() # ggtitle(“Death Probability vs Age and Year for the USA”) + # labs(caption = “Data Source: US Dept. of Social Security”)
rayshader:: plot_gg(deathgg, multicore=TRUE) height=5,width=6,scale=500
heart rate
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5cblxuXG5cbnVuaXF1ZShkYl9mdWxsNm5ldyRCaW9fTWVhbl9IUilcbnVuaXF1ZShkYl9mdWxsNm5ldyRCaW9fTWVhbl9IUl9maXgpXG5cblxuVmlldyhkYl9mdWxsNm5ldylcblxuZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdFxuICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JVxuICAjIHN1YnNldChzc2lkID09IDMxNCklPiVcbiAgICBncm91cF9ieShzc2lkKSU+JVxuICAgIG11dGF0ZShCSU9fQ0RBLlNDUl96ID0gc2NhbGUobG9nMXAoQklPX0NEQS5QaGFzaWNNYXggKy4xKSlbLDFdKSU+JVxuICAgIG11dGF0ZShhcm91c2FsX3ogPSBzY2FsZShhcm91c2FsICsuMSkpJT4lXG4gIGdncGxvdChhZXMoYXJvdXNhbF96LEJJT19DREEuU0NSX3osIGNvbG9yID1tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSAsIHNoYXBlID1tZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCkpK1xuICAgIGdlb21fcG9pbnQoKStcbiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpK1xuICAgIGZhY2V0X3dyYXAofnNzaWQpK1xuICAgIGdncHVicjo6c3RhdF9jb3IoKVxuXG5cbmBgYCJ9 -->
```r
unique(db_full6new$Bio_Mean_HR)
unique(db_full6new$Bio_Mean_HR_fix)
View(db_full6new)
db_full4new_stim_screen_pupil_nopract
db_full4new_stim_screen_pupil_nopract %>%
# subset(ssid == 314)%>%
group_by(ssid)%>%
mutate(BIO_CDA.SCR_z = scale(log1p(BIO_CDA.PhasicMax +.1))[,1])%>%
mutate(arousal_z = scale(arousal +.1))%>%
ggplot(aes(arousal_z,BIO_CDA.SCR_z, color =mediansplit_ground_valence , shape =mediansplit_ground_arousal))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
facet_wrap(~ssid)+
ggpubr::stat_cor()
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG4jIGtlZXAgc3RpbSBhbmQgYW5kIGZpeGF0aW9uXG5cbnVuaXF1ZShkYl9mdWxsNm5ldyRzY3JlZW5jb250ZW50KVxudW5pcXVlKGRiX2Z1bGw2bmV3JHNjcmVlbmNvbnRlbnRfbm8pXG5kYl9mdWxsNm5ld19ocl9maXhfc3RpbTwtIHN1YnNldChkYl9mdWxsNm5ldywgc2NyZWVuY29udGVudF9ubyA8MylcblZpZXcoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW0pXG4jIGZpeGF0aW9uXCIgICAgXCJzdGltXCIgXG5cbiMga2VlcCBjb250cm9sc1xudW5pcXVlKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltJHNzaWQpXG5kYl9mdWxsNm5ld19ocl9maXhfc3RpbSRzc2lkX251bSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYl9mdWxsNm5ld19ocl9maXhfc3RpbSRzc2lkKSlcblxuXG5cbmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250PC0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltLCBHcm91cCA9PSBcIk5UXCIpXG51bmlxdWUoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQkc3NpZF9udW0pXG5cbmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250PC0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltLCBzc2lkX251bT4gMzAzKVxudW5pcXVlKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JHNzaWQpXG5cbiMgSFIgZGlmZmVyZW5jZXNcbmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JEJpb19NZWFuX0hSX2ZpeDwtIGlmX2Vsc2UoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQkc2NyZWVuY29udGVudF9ubyA9PTEsIGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JEJpb19NZWFuX0hSLCBOVUxMKVxuXG5WaWV3KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250KVxuXG5saWJyYXJ5KGRwbHlyKVxubGlicmFyeSh0aWR5dmVyc2UpXG5kYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDE8LSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udCAlPiVcbiAgZ3JvdXBfYnkoc3NpZCwgdE5vKSAlPiVcbiAgYXJyYW5nZShzc2lkLCB0Tm8sc2NyZWVuY29udGVudF9ubyklPiVcbiAgZmlsbChCaW9fTWVhbl9IUl9maXgsIC5kaXJlY3Rpb24gPSBcImRvd25cIiklPiVcbiAgc3Vic2V0KHNjcmVlbmNvbnRlbnRfbm8gPT0gMilcblxuVmlldyhkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpXG5cbmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MTwtIGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSAlPiVcbiAgbXV0YXRlKEJpb19NZWFuX0hSX2RpZiA9IEJpb19NZWFuX0hSIC0gQmlvX01lYW5fSFJfZml4KVxuIyAyIDFcbnN0aW0gLSBmaXhcbmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JVxuICBnZ3Bsb3QoYWVzKEJpb19NZWFuX0hSX2RpZikpK1xuICBnZW9tX2hpc3RvZ3JhbSgpXG5cbj9zY2F0dGVyM2QgXG5cblxuZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJT4lXG4gIHN1YnNldCghaXMubmEocHVwX2Jhc0NvcikpJT4lXG4gICBzdWJzZXQoIWlzLm5hKEJJT19DREEuUGhhc2ljTWF4X3opKSU+JVxuICBzdWJzZXQoIWlzLm5hKEJpb19NZWFuX0hSX2RpZikpXG5cblxuZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxPC0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJT4lXG4gIGdyb3VwX2J5KHNzaWQpJT4lXG4gIG11dGF0ZShCSU9fQ0RBLlBoYXNpY01heF96PSBzY2FsZShCSU9fQ0RBLlBoYXNpY01heCwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKVssMV0pXG5cbnNjYXR0ZXIzZCh4ID0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJHB1cF9iYXNDb3IsIFxuICAgICAgICAgIHkgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkQklPX0NEQS5QaGFzaWNNYXhfeiwgXG4gICAgICAgICAgeiA9IGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSRCaW9fTWVhbl9IUl9kaWYsIFxuICAgICAgICAgIGZpdCA9IFwic21vb3RoXCIsXG4gICAgICAgICAgXG4gICAgICAgICAgc3VyZmFjZSA9IEZBTFNFLFxuICAgICAgICAgIHBvaW50LmNvbCA9IFwiYmx1ZVwiLFxuICAgICAgICAgICMgcG9pbnRcbiAgICAgICAgICBncm91cHMgPSBhcy5mYWN0b3IoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsKSxcbiAgICAgICAgICBlbGxpcHNvaWQgPSBUUlVFKVxuXG5cblxuY29yKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MVssYyhcInB1cF9iYXNDb3JcIiwgXCJCSU9fQ0RBLlBoYXNpY01heF96XCIsXCJCaW9fTWVhbl9IUl9kaWZcIildLCB1c2UgPSBcImNvbXBsZXRlXCIpXG5cblxuXG5kYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiVcbiAgZ3JvdXBfYnkoc3NpZCxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiVcbiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiVcbiAgZ2dwbG90KGFlcyhwdXBfYmFzQ29yLEJJT19DREEuUGhhc2ljTWF4X3osIGNvbG9yPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrXG4gIHlsaW0oMCwuNCkrXG4gIGdncHVicjo6c3RhdF9jb3IoKVxuXG5cblxuZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJT4lXG4gICMgZ3JvdXBfYnkoc3NpZCklPiVcbiAgIyBtdXRhdGUoQmlvX01lYW5fSFJfZGlmX3ogPSBzY2FsZShCaW9fTWVhbl9IUl9kaWYpKVxuICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JVxuICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JVxuICBnZ3Bsb3QoYWVzKHB1cF9iYXNDb3IsQmlvX01lYW5fSFJfZGlmX3osIGNvbG9yPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpK1xuICBnZW9tX3BvaW50KCkrXG4gIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrXG4gICMgeWxpbSgtNywyKStcbiAgZ2dwdWJyOjpzdGF0X2NvcigpXG5cblxuXG5kYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiVcbiAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lXG4gICMgZ3JvdXBfYnkoc3NpZCklPiVcbiAgIyBtdXRhdGUoQmlvX01lYW5fSFJfZGlmX3ogPSBzY2FsZShCaW9fTWVhbl9IUl9kaWYpKVxuICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JVxuICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JVxuICBnZ3Bsb3QoYWVzKEJJT19DREEuUGhhc2ljTWF4X3osQmlvX01lYW5fSFJfZGlmLCBjb2xvcj0gbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpK1xuICAjIHlsaW0oLTcsMikrXG4gIGdncHVicjo6c3RhdF9jb3IoKStcbiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpXG4gIFxuXG5gYGAifQ== -->
```r
# keep stim and and fixation
unique(db_full6new$screencontent)
unique(db_full6new$screencontent_no)
db_full6new_hr_fix_stim<- subset(db_full6new, screencontent_no <3)
View(db_full6new_hr_fix_stim)
# fixation" "stim"
# keep controls
unique(db_full6new_hr_fix_stim$ssid)
db_full6new_hr_fix_stim$ssid_num <- as.numeric(as.character(db_full6new_hr_fix_stim$ssid))
db_full6new_hr_fix_stim_nt<- subset(db_full6new_hr_fix_stim, Group == "NT")
unique(db_full6new_hr_fix_stim_nt$ssid_num)
db_full6new_hr_fix_stim_nt<- subset(db_full6new_hr_fix_stim, ssid_num> 303)
unique(db_full6new_hr_fix_stim_nt$ssid)
# HR differences
db_full6new_hr_fix_stim_nt$Bio_Mean_HR_fix<- if_else(db_full6new_hr_fix_stim_nt$screencontent_no ==1, db_full6new_hr_fix_stim_nt$Bio_Mean_HR, NULL)
View(db_full6new_hr_fix_stim_nt)
library(dplyr)
library(tidyverse)
db_full6new_hr_fix_stim_nt1<- db_full6new_hr_fix_stim_nt %>%
group_by(ssid, tNo) %>%
arrange(ssid, tNo,screencontent_no)%>%
fill(Bio_Mean_HR_fix, .direction = "down")%>%
subset(screencontent_no == 2)
View(db_full6new_hr_fix_stim_nt1)
db_full6new_hr_fix_stim_nt1<- db_full6new_hr_fix_stim_nt1 %>%
mutate(Bio_Mean_HR_dif = Bio_Mean_HR - Bio_Mean_HR_fix)
# 2 1
stim - fix
db_full6new_hr_fix_stim_nt1%>%
ggplot(aes(Bio_Mean_HR_dif))+
geom_histogram()
?scatter3d
db_full6new_hr_fix_stim_nt1%>%
subset(!is.na(pup_basCor))%>%
subset(!is.na(BIO_CDA.PhasicMax_z))%>%
subset(!is.na(Bio_Mean_HR_dif))
db_full6new_hr_fix_stim_nt1<- db_full6new_hr_fix_stim_nt1%>%
group_by(ssid)%>%
mutate(BIO_CDA.PhasicMax_z= scale(BIO_CDA.PhasicMax, center = TRUE, scale = TRUE)[,1])
scatter3d(x = db_full6new_hr_fix_stim_nt1$pup_basCor,
y = db_full6new_hr_fix_stim_nt1$BIO_CDA.PhasicMax_z,
z = db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif,
fit = "smooth",
surface = FALSE,
point.col = "blue",
# point
groups = as.factor(db_full6new_hr_fix_stim_nt1$mediansplit_ground_arousal),
ellipsoid = TRUE)
cor(db_full6new_hr_fix_stim_nt1[,c("pup_basCor", "BIO_CDA.PhasicMax_z","Bio_Mean_HR_dif")], use = "complete")
db_full6new_hr_fix_stim_nt1%>%
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(pup_basCor,BIO_CDA.PhasicMax_z, color= mediansplit_ground_valence))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ylim(0,.4)+
ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt1%>%
# group_by(ssid)%>%
# mutate(Bio_Mean_HR_dif_z = scale(Bio_Mean_HR_dif))
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(pup_basCor,Bio_Mean_HR_dif_z, color= mediansplit_ground_valence))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# ylim(-7,2)+
ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt1%>%
subset(!is.na(mediansplit_ground_valence))%>%
# group_by(ssid)%>%
# mutate(Bio_Mean_HR_dif_z = scale(Bio_Mean_HR_dif))
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(BIO_CDA.PhasicMax_z,Bio_Mean_HR_dif, color= mediansplit_ground_valence))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# ylim(-7,2)+
ggpubr::stat_cor()+
facet_grid(~mediansplit_ground_valence)
db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif_outl<- if_else(abs(db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif)>
(median(abs(db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif),na.rm = TRUE) + (4*(sd(abs(db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif), na.rm = TRUE)))), "outlier", "not outlier")
db_full6new_hr_fix_stim_nt1%>%
ggplot(aes(Bio_Mean_HR_dif))+
geom_histogram()+
facet_grid(~Bio_Mean_HR_dif_outl)
db_full6new_hr_fix_stim_nt1 %>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
subset(ssid_num<500)%>%
group_by(ssid)%>%
mutate(Bio_Mean_HR_dif_ssid = mean(Bio_Mean_HR_dif, na.rm = TRUE))%>%
group_by(ssid)%>%
# mutate(Bio_Mean_HR_dif_stim = mean(Bio_Mean_HR_dif, na.rm = TRUE))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(TASc, Bio_Mean_HR_dif))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt1 %>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
subset(ssid_num<500)%>%
# group_by(ssid)%>%
mutate(Bio_Mean_HR_dif = abs(Bio_Mean_HR_dif))%>%
group_by(ssid, stimIAPS)%>%
mutate(Bio_Mean_HR_dif_stim = abs(Bio_Mean_HR_dif))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(TASc, Bio_Mean_HR_dif))+
# geom_point()
geom_smooth(aes(group = stimIAPS, y =Bio_Mean_HR_dif_stim), method=lm, se=FALSE, colour = "gray40", alpha = .01,linetype="dashed", size = .2 )+
geom_smooth( method=lm, se=FALSE, linetype="dashed",
color="darkred", size = 2)+
stat_summary(geom = 'pointrange', pch = 1)+
# geom_point()+
# stat_summary(aes(group =ssid, y = Bio_Mean_HR_dif),method = "line",alpha = .1)+
# ggpubr::stat_cor()+
p$graphstyle+
xlab("Alexithymia (Z)")+
ylab("HR difference")+
p$graphstyle
hr_bio <- lmer(Bio_Mean_HR_dif ~ TASc *arousal_c + (1|ssid) + (1| stimIAPS),
REML = FALSE,
data = subset(db_full6new_hr_fix_stim_nt1, Bio_Mean_HR_dif_outl == "not outlier"))
interactions::interact_plot(hr_bio, pred = arousal_c, modx = TASc)
subset(db_full6new_hr_fix_stim_nt1, Bio_Mean_HR_dif_outl == "not outlier")
db_full6new_hr_fix_stim_nt1 %>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
group_by(ssid)%>%
mutate(cor_hrdif_ar = cor(Bio_Mean_HR_dif, arousal_c))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(TAS, cor_hrdif_ar))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
p$graphstyle
db_full6new_hr_fix_stim_nt1 %>%
subset(TAS<70)%>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
group_by(ssid,mediansplit_ground_valence)%>%
mutate(cor_hrdif_ar = cor(Bio_Mean_HR_dif, arousal_c))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_valence, cor_hrdif_ar))+
geom_jitter(alpha = .1, width = .1)+
stat_summary(geom = 'pointrange')
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
p$graphstyle
db_full6new_hr_fix_stim_nt1 %>% # subset(Bio_Mean_HR_dif_outl == “not outlier”)%>% group_by(ssid)%>% mutate(cor_hrdif_ar = cor(Bio_Mean_HR_dif, arousal_c))%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(TAS, cor_hrdif_ar))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt1<- db_full6new_hr_fix_stim_nt1%>%
group_by(stimIAPS)%>%
mutate(ValenceMeanThisSample = mean(valence, na.rm = TRUE),
ArousalMeanThisSample = mean(arousal, na.rm = TRUE))
db_full6new_hr_fix_stim_nt1<- db_full6new_hr_fix_stim_nt1%>%
ungroup()%>%
mutate(mediansplit_ground_valence = if_else(ValenceMean >=
median(ValenceMean,
na.rm = TRUE), "More positive", "More negative"))%>%
mutate(mediansplit_ground_arousal = if_else(ArousalMean >=
median(ArousalMean,
na.rm = TRUE), "High", "Low"))%>%
mutate(mediansplit_sample_valence2 = if_else(ValenceMeanThisSample >=
median(ValenceMeanThisSample,
na.rm = TRUE), "More positive", "More negative"))%>%
mutate(mediansplit_sample_arousal2 = if_else(ArousalMeanThisSample >=
median(ArousalMeanThisSample,
na.rm = TRUE), "High", "Low"))
db_full6new_hr_fix_stim_nt1%>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
subset(!is.na(mediansplit_ground_valence))%>%
group_by(ssid,mediansplit_ground_arousal, mediansplit_ground_valence,)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_arousal, Bio_Mean_HR_dif))+
geom_jitter(alpha = .2, width = .2)+
geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
stat_summary(geom = 'pointrange')+
# stat_smooth(aes(group = ssid), se = F, method = 'lm', alpha = .2)+
facet_grid(~mediansplit_ground_valence)
db_full6new_hr_fix_stim_nt1%>%
subset(!is.na(mediansplit_ground_valence))%>%
subset(Bio_Mean_HR_dif_outl== "not outlier")%>%
group_by(ssid, mediansplit_ground_arousal,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_arousal, Bio_Mean_HR_dif, fill = mediansplit_ground_valence))+
geom_jitter(alpha = .2, width = .2)+
geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
stat_summary(geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', alpha = .2)+
facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_compare_means()
# p$graphstyle+
scale_fill_brewer(palette = "Dark2")+
# stat_smooth(aes(group = ssid), se = F, method = ‘lm’, alpha = .2)
db_full6new_hr_fix_stim_nt1%>% subset(!is.na(mediansplit_ground_valence))%>% subset(Bio_Mean_HR_dif_outl!= “outlier”)%>% group_by(ssid, mediansplit_ground_arousal,mediansplit_ground_valence)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(mediansplit_ground_arousal, Bio_Mean_HR_dif))+ geom_jitter(alpha = .2, width = .2)+ geom_bar(stat=“summary”, fun.y = “mean”, alpha = .2)+ stat_summary(geom = ‘pointrange’)+ ggpubr::stat_compare_means()+ facet_grid(~mediansplit_ground_valence)
self
db_full6new_hr_fix_stim_nt1%>% subset(!is.na(mediansplit_ground_valence))%>% subset(Bio_Mean_HR_dif_outl!= “outlier”)%>% group_by(ssid, mediansplit_sample_arousal2,mediansplit_sample_valence2)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(mediansplit_sample_arousal2, Bio_Mean_HR_dif))+ geom_jitter(alpha = .2, width = .2)+ stat_summary(aes(group = ssid), geom = ‘line’, alpha = .1, size = .4, colour = “Black”) + # geom_bar(stat=“summary”, fun.y = “mean”, alpha = .2)+ stat_summary(geom = ‘pointrange’)+ ggpubr::stat_compare_means()+ facet_grid(~mediansplit_sample_valence2)
lmer( db_full6new_hr_fix_stim_nt1)
db_full6new_hr_fix_stim_nt1%>% group_by(ssid)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(arousal))+ geom_histogram()
# test - analyse just positive
hr_dif_models$arousal_val <- lmer(Bio_Mean_HR_dif ~ valence_c *arousal_c+
+ (1 | ssid) + (1|stimIAPS),
# (1|mediansplit_sample_arousal2),
REML = FALSE,
data = subset(db_full6new_hr_fix_stim_nt1, mediansplit_ground_valence == "More positive" & Bio_Mean_HR_dif_outl == "not outlier" & Group == "NT"))
summary(hr_dif_models$arousal_val)
unique(db_full6new_hr_fix_stim_nt1$ssid)
hr_dif_models$valfrom_hr <- lmer(valence_c ~ Bio_Mean_HR_dif* arousal_c+
+ (1 | ssid) + (1|stimIAPS),
# (1|mediansplit_sample_arousal2),
REML = FALSE,
data = subset(db_full6new_hr_fix_stim_nt1, mediansplit_ground_valence == "More positive" &
Bio_Mean_HR_dif_outl == "not outlier" & Group == "NT"))
arousal_c
summary(hr_dif_models$valfrom_hr)
interactions::interact_plot(hr_dif_models$valfrom_hr, pred = Bio_Mean_HR_dif, modx = arousal_c)
plot(hr_dif_models$arousal_val)
car::vif(hr_dif_models$arousal_val)
# valence_c arousal_c valence_c:arousal_c
# 1.767605 1.708642 1.070635
?step
?lmerTest::step()
lmerTest::step(hr_dif_models$arousal_val)
# favours valence
# check the response bias thing
db_full6new_hr_fix_stim_nt1 %>%
subset(!is.na(mediansplit_ground_valence))%>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
ggplot(aes(log10(arousal+10.5) ,Bio_Mean_HR_dif))+
# geom_point(alpha = .1)+
facet_grid(~mediansplit_ground_valence)+
geom_smooth(method = 'lm', se = F)+
ggside::geom_ysidedensity(aes(x=stat(density, fill = mediansplit_self_valence), alpha = .4))+
ggside::geom_xsidedensity(aes(y=stat(density, fill = mediansplit_self_valence), alpha = .4))
scatter3d(x = db_full6new_hr_fix_stim_nt1$valence_c,
y =db_full6new_hr_fix_stim_nt1$Bio_Mean_HR_dif, z =db_full6new_hr_fix_stim_nt1$arousal_c,
# fit = "smooth",
# surface = FALSE,
point.col = "blue",
# point
# ellipsoid = db_full6new_hr_fix_stim_nt1$mediansplit_sample_valence2)
ellipsoid = TRUE)
db_full6new_hr_fix_stim_nt1%>%
group_by(stimIAPS, mediansplit_ground_valence, mediansplit_ground_arousal)%>%
ggplot(aes(mediansplit_ground_valence, ValenceMean))+
geom_point()
db_full6new_hr_fix_stim_nt1%>%
subset(Condition == "IAPS")%>%
group_by(stimIAPS, mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_valence, arousal))+
stat_summary(geom = 'pointrange')+
ggpubr::stat_compare_means()+
geom_text(aes(label = stimIAPS))
check corelation between arousal and valence on and individual basis
db_full6new_hr_fix_stim_nt1$arousal_c
subset(db_full6new_hr_fix_stim_nt1, mediansplit_ground_valence == "More positive" & Bio_Mean_HR_dif_outl == "not outlier") %>%
group_by(ssid)%>%
mutate(cor_vale_ar = cor(arousal, valence, use = "complete"))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(cor_vale_ar))+
geom_histogram()+
geom_vline(xintercept = -.7)
subset(db_full6new_hr_fix_stim_nt1)%>%
# group_by(mediansplit_ground_valence, stimIAPS)%>%
# summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes( valence, arousal))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# geom_smooth(aes(group = ssid), se = F, method = 'lm')+
# facet_grid(~mediansplit_ground_valence)+
ggpubr::stat_cor()
subset(db_full6new_hr_fix_stim_nt1)%>%
subset(ssid == 331)%>%
# group_by(mediansplit_ground_valence, stimIAPS)%>%
# summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes( as.numeric(tNo), arousal))+
geom_point()+
stat_summary(geom = "line")+
geom_point(aes(y = valence), color = "green")+
stat_summary(aes(y = valence),geom = "line", linetype = "dashed", color = "green")
# geom_smooth(method = 'lm', se = F)+
# geom_smooth(aes(group = ssid), se = F, method = 'lm')+
# facet_grid(~mediansplit_ground_valence)+
# ggpubr::stat_cor()
try and regress valence our oarousal_val
db_full6new_hr_fix_stim_nt2
db_full6new_hr_fix_stim_nt3<- subset(db_full6new_hr_fix_stim_nt2, !is.na(valence))
hr_dif_models$arosal_from_val <- lmer(arousal_c~ valence_c + + (1 | ssid) + (1|stimIAPS), # (1|mediansplit_sample_arousal2), REML = FALSE, data = subset(db_full6new_hr_fix_stim_nt3))
hr_dif_models$val_from_arousal <- lmer(valence_c~arousal_c+ + (1 | ssid) + (1|stimIAPS), # (1|mediansplit_sample_arousal2), REML = FALSE, data = subset(db_full6new_hr_fix_stim_nt3))
hr_dif_models\(arosal_from_val plot(hr_dif_models\)arosal_from_val)
?residuals ?resid ?residuals.merMod db_full6new_hr_fix_stim_nt3\(arous_val_resid <- residuals(hr_dif_models\)arosal_from_val)
db_full6new_hr_fix_stim_nt3\(val_from_arous_resid<- residuals(hr_dif_models\)val_from_arousal)
residuals.merMod(hr_dif_models$arosal_from_val)
ar_frm_val<- lm(arousal_c ~ valence_c, data = db_full6new_hr_fix_stim_nt3)
val_frm_val<- lm( valence_c~arousal_c, data = db_full6new_hr_fix_stim_nt3)
db_full6new_hr_fix_stim_nt3%>%ggplot(aes(val_from_arous_resid, arous_val_resid))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ ggpubr::stat_cor()
resid(ar_frm_val)
resid(val_frm_val)
# 1 2 3 4 5 6 7 8
# 0.149962843 0.505815507
#
# -0.637512958 0.044580602
Is the residual of A~ B the same as B~A
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5ocl9kaWZfbW9kZWxzJHZhbF9mcm9tX2Fyb3VzYWwgPC0gbG1lcih2YWxlbmNlX2N+YXJvdXNhbF9jK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDEgfCBzc2lkKSArICgxfHN0aW1JQVBTKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiksXG4gICAgIFJFTUwgPSBGQUxTRSxcbiAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDMpKVxuXG5cbmhyX2RpZl9tb2RlbHMkYmlvaHJfZGlmX2Fyb3VzX3JlcyA8LSBsbWVyKEJpb19NZWFuX0hSX2RpZn4gIHZhbF9mcm9tX2Fyb3VzX3Jlc2lkICphcm91c192YWxfcmVzaWQrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IHNzaWQpICsgKDF8c3RpbUlBUFMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKDF8bWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSxcbiAgICAgUkVNTCA9IEZBTFNFLFxuICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MywgQmlvX01lYW5fSFJfZGlmX291dGwgPT0gXCJub3Qgb3V0bGllclwiKSlcblxuXG5zdW1tYXJ5KGhyX2RpZl9tb2RlbHMkYmlvaHJfZGlmX2Fyb3VzX3JlcylcblxuIyBhbmFseXNlcyBvZiByZXNpZHVhbHMgYWxzbyBzdWdnZXRzIHRoYXQgZWZmZWN0cyBvbiBiaW9faHIgYXJlIHJlbGF0ZWQgdG8gY29tbW9uIGFyb3VzYWwgYW5kIHZhbGVuY2UgcmVsYXRpb25cblxuYGBgIn0= -->
```r
hr_dif_models$val_from_arousal <- lmer(valence_c~arousal_c+
+ (1 | ssid) + (1|stimIAPS),
# (1|mediansplit_sample_arousal2),
REML = FALSE,
data = subset(db_full6new_hr_fix_stim_nt3))
hr_dif_models$biohr_dif_arous_res <- lmer(Bio_Mean_HR_dif~ val_from_arous_resid *arous_val_resid+
+ (1 | ssid) + (1|stimIAPS),
# (1|mediansplit_sample_arousal2),
REML = FALSE,
data = subset(db_full6new_hr_fix_stim_nt3, Bio_Mean_HR_dif_outl == "not outlier"))
summary(hr_dif_models$biohr_dif_arous_res)
# analyses of residuals also suggets that effects on bio_hr are related to common arousal and valence relation
interactions::interact_plot(hr_dif_models$arousal_val, pred= arousal_c, modx = valence_c)
alexithjymia
db_full6new_hr_fix_stim_nt1\(Bio_Mean_HR_dif_z<- scale(db_full6new_hr_fix_stim_nt1\)Bio_Mean_HR_dif, center = TRUE, scale = TRUE)[,1] hr_dif_models$arousal_val_cat <- lmer(Bio_Mean_HR_dif_z ~TASc*arousal_c+ + (1 | ssid) + (1|stimIAPS), # (1|mediansplit_sample_arousal2), REML = FALSE, data = db_full6new_hr_fix_stim_nt1)
interactions::interact_plot(hr_dif_models$arousal_val_cat, pred= arousal_c, modx = TASc)
summary(hr_dif_models$arousal_val_cat)
plot(hr_dif_models\(arousal_val) plot(hr_dif_models\)arousal_val_cat)
summary(hr_dif_models$arousal_val_cat)
hr_dif_models$arousal_val_cat <- lmer(Bio_Mean_HR_dif~ mediansplit_sample_arousal2* mediansplit_sample_valence2+
+ (1+mediansplit_sample_valence2 | ssid) + (1|stimIAPS),
# (1|mediansplit_sample_arousal2),
REML = FALSE,
data = db_full6new_hr_fix_stim_nt1)
summary(hr_dif_models$arousal_val_cat)
interactions::cat_plot(hr_dif_models$arousal_val_cat, pred = mediansplit_sample_arousal2, modx = mediansplit_sample_valence2)
correlation
db_full6new_hr_fix_stim_nt1%>%
subset(!is.na(mediansplit_ground_valence))%>%
subset(Bio_Mean_HR_dif_outl!= "outlier")%>%
group_by(ssid,mediansplit_ground_valence, mediansplit_ground_arousal)%>%
mutate(cor_hr_arous = cor(Bio_Mean_HR_dif, arousal, use = "complete"))%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(mediansplit_ground_valence, cor_hr_arous))+
# geom_jitter(alpha = .2, width = .2)+
geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
stat_summary(geom = 'pointrange')+
# geom_smooth(aes(group = ssid), color = 'gray', method = 'lm', se = F)+
ggpubr::stat_compare_means()+
facet_grid(~mediansplit_ground_arousal)
# xlim(-5,3)
db_full6new_hr_fix_stim_nt1 %>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(Age, TASc))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
hr_dif_models<- list()
hr_dif_models$arousal_val <- lmer(Bio_Mean_HR_dif~ (arousal_c*valence_c )* TASc +(1+arousal_c | ssid) + (1|stimIAPS),
REML = FALSE,
data = db_full6new_hr_fix_stim_nt1)
summary(hr_dif_models$arousal_val)
interactions::interact_plot(hr_dif_models$arousal_val, pred = arousal_c, modx = TASc)
hr_dif_models$arousal_val <- lmer(Bio_Mean_HR~ arousal_c* valence_c +(1+arousal_c| ssid),
# + (1|stimIAPS),
REML = FALSE,
data = db_full6new_hr_fix_stim_nt1)
summary(hr_dif_models$arousal_val)
# plot(hr_dif_models$arousal_val)
interactions::interact_plot(hr_dif_models$arousal_val, pred = valence_c, modx = arousal_c)
import HRV resting
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5SZXN0X0hSViA8LSByZWFkX2V4Y2VsKFwiUmVzdCBIUlYueGxzeFwiKVxuVmlldyhSZXN0X0hSVikgIFxuXG5SZXN0X0hSViU+JVxuICBnZ3Bsb3QoYWVzKFJNU1NEKSkrXG4gIGdlb21faGlzdG9ncmFtKClcblxuUmVzdF9IUlYlPiVcbiAgZ2dwbG90KGFlcyhSTVNTRCkpK1xuICBnZW9tX2hpc3RvZ3JhbSgpXG5cblJlc3RfSFJWJT4lXG4gIGdncGxvdChhZXMoTUVBTkhSKSkrXG4gIGdlb21faGlzdG9ncmFtKClcblxuQklPX0hSVmFuYWx5c3lzJHNzaWQ8LSBhcy5jaGFyYWN0ZXIoQklPX0hSVmFuYWx5c3lzJHNzaWQpXG5cbmxlZnRfam9pbihCSU9fSFJWYW5hbHlzeXMsIFJlc3RfSFJWLCBieSA9IFwic3NpZFwiKSU+JVxuICBnZ3Bsb3QoYWVzKFJNU1NELCBSTU1TU0QpKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3B1YnI6OnN0YXRfY29yKClcblxuXG4jIGxpYnJhcnkocmVhZHhsKVxuXG5cblJlc3RfcHJhY3RpY2VfSFJWIDwtIHJlYWRfZXhjZWwoXCJSZXN0ICsgcHJhY3RpY2UgSFJWLnhsc3hcIilcblZpZXcoUmVzdF9wcmFjdGljZV9IUlYpXG5SZXN0X3ByYWN0aWNlX0hSViRzc2lkPC0gYXMuY2hhcmFjdGVyKFJlc3RfcHJhY3RpY2VfSFJWJHNzaWQpXG5cbmxlZnRfam9pbihSZXN0X3ByYWN0aWNlX0hSViwgQklPX0hSVmFuYWx5c3lzLCBieSA9IFwic3NpZFwiKSU+JVxuICBnZ3Bsb3QoYWVzKFJNU1NELCBSTU1TU0QpKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3B1YnI6OnN0YXRfY29yKClcblxuXG5sZWZ0X2pvaW4oUmVzdF9wcmFjdGljZV9IUlYsIFJlc3RfSFJWLCBieSA9IFwic3NpZFwiKSU+JVxuICBnZ3Bsb3QoYWVzKFJNU1NELngsIFJNU1NELnkpKStcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3B1YnI6OnN0YXRfY29yKClcblxuXG5SZXN0X3ByYWN0aWNlX0hSViU+JVxuICBnZ3Bsb3QoYWVzKE1FQU5IUikpK1xuICBnZW9tX2hpc3RvZ3JhbSgpXG4gIFxuIyBpbXBvcnQgaHJ2IHRhc2tcbmxpYnJhcnkocmVhZHhsKVxuaHJ2UmVzdWx0c1Rhc2sgPC0gcmVhZF9leGNlbChcIlN1bW1hcnlfaHJ2UmVzdWx0c1Rhc2sueGxzXCIpXG5WaWV3KGhydlJlc3VsdHNUYXNrKVxuXG5gYGAifQ== -->
```r
Rest_HRV <- read_excel("Rest HRV.xlsx")
View(Rest_HRV)
Rest_HRV%>%
ggplot(aes(RMSSD))+
geom_histogram()
Rest_HRV%>%
ggplot(aes(RMSSD))+
geom_histogram()
Rest_HRV%>%
ggplot(aes(MEANHR))+
geom_histogram()
BIO_HRVanalysys$ssid<- as.character(BIO_HRVanalysys$ssid)
left_join(BIO_HRVanalysys, Rest_HRV, by = "ssid")%>%
ggplot(aes(RMSSD, RMMSSD))+
geom_point()+
ggpubr::stat_cor()
# library(readxl)
Rest_practice_HRV <- read_excel("Rest + practice HRV.xlsx")
View(Rest_practice_HRV)
Rest_practice_HRV$ssid<- as.character(Rest_practice_HRV$ssid)
left_join(Rest_practice_HRV, BIO_HRVanalysys, by = "ssid")%>%
ggplot(aes(RMSSD, RMMSSD))+
geom_point()+
ggpubr::stat_cor()
left_join(Rest_practice_HRV, Rest_HRV, by = "ssid")%>%
ggplot(aes(RMSSD.x, RMSSD.y))+
geom_point()+
ggpubr::stat_cor()
Rest_practice_HRV%>%
ggplot(aes(MEANHR))+
geom_histogram()
# import hrv task
library(readxl)
hrvResultsTask <- read_excel("Summary_hrvResultsTask.xls")
View(hrvResultsTask)
combine with data
Rest_HRV
Rest_HRV$subject<- NULL
nrow(db_full6new_hr_fix_stim_nt1)
# 2160
db_full6new_hr_fix_stim_nt2<- left_join(db_full6new_hr_fix_stim_nt1, Rest_HRV)
# hrv rest vs hrtaskCallbackManager(
left_join(Rest_HRV, hrvResultsTask, by = "ssid") %>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(RMSSD.x, RMSSD.y))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
xlim(0,100)+
ylim(0,100)
Rest_HRV$hrvcondition<- "rest"
hrvResultsTask$hrvcondition<- "task"
left_join(Rest_HRV, hrvResultsTask, by = "ssid") %>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(RMSSD.x, RMSSD.y))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()+
xlim(0,100)+
ylim(0,100)
colnames(hrvResultsTask)
bind_rows(Rest_HRV, hrvResultsTask)%>%
subset(RMSSD<100)%>%
ggplot(aes(hrvcondition, hfpower))+
geom_jitter(width = .1, alpha = .1)+
stat_summary(geom = 'pointrange')+
stat_summary(aes(group = ssid), geom = 'line', alpha = .1)
left_join(db_full6new_hr_fix_stim_nt1, hrvResultsTask) %>%
group_by(ssid)%>%
mutate(cor = cor(arousal, pup_basCor, use = "complete"))%>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(NN50,cor ))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
xlim(0,500)+
ggpubr::stat_cor()
left_join(db_full6new_hr_fix_stim_nt1, hrvResultsTask) %>%
group_by(ssid)%>%
mutate(cor = cor(arousal, pup_basCor, use = "complete"))%>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(TASc, NN50))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# ylim(0,200)+
ggpubr::stat_cor()
hrvResultsTask%>%
ggplot(aes(RMSSD))+
geom_histogram()
left_join(db_full6new_hr_fix_stim_nt1, hrvResultsTask) %>%
subset(!is.na(mediansplit_ground_valence))%>%
# group_by(ssid)%>%
# mutate(cor = cor(arousal, pup_basCor, use = "complete"))%>%
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(RMSSD,pup_basCor,color = mediansplit_ground_valence ))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# xlim(0,100)+
ggpubr::stat_cor()
left_join(db_full6new_hr_fix_stim_nt1, hrvResultsTask) %>%
subset(!is.na(mediansplit_ground_valence))%>%
# group_by(ssid)%>%
# mutate(cor = cor(arousal, pup_basCor, use = "complete"))%>%
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(RMSSD,BIO_CDA.PhasicMax_z,color = mediansplit_ground_valence ))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
xlim(0,100)+
ggpubr::stat_cor()
left_join(db_full6new_hr_fix_stim_nt1, hrvResultsTask) %>%
subset(!is.na(mediansplit_ground_valence))%>%
subset(Bio_Mean_HR_dif_outl == "not outlier")%>%
# group_by(ssid)%>%
# mutate(cor = cor(arousal, pup_basCor, use = "complete"))%>%
group_by(ssid,mediansplit_ground_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(`LF/HF`,BIO_CDA.PhasicMax_z,color = mediansplit_ground_valence ))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
# xlim(0,5000)+
ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt2 %>% group_by(ssid)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(Bio_Mean_HR_dif, lfpower))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt2 %>% group_by(ssid)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(MEANHR, RMSSD))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ ggpubr::stat_cor()
db_full6new_hr_fix_stim_nt2 %>% group_by(ssid)%>% summarise_if(is.numeric, mean, na.rm = TRUE)%>% ggplot(aes(MEANHR, Bio_Mean_HR))+ geom_point()+ geom_smooth(method = ‘lm’, se = F)+ ggpubr::stat_cor()
<!-- rnb-text-end -->
<!-- rnb-chunk-begin -->
<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyB3b3JrIG9uIHRoaXNcbmRiX2Z1bGw2bmV3XzMwNF91cCRcbmNvbG5hbWVzKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QpXG5jb2xuYW1lcyhkYl9mdWxsNm5ld18zMDRfdXApXG4jIGRiX2Z1bGw2bmV3XG51bmlxdWUoZGJfZnVsbDZuZXdfMzA0X3VwJHNjcmVlbmNvbnRlbnQpXG5cblZpZXcoZGJfZnVsbDZuZXcpXG5cbiMgc3RvcmUgaGVhcnQgcmF0ZSBiYXNlbGluZSB0byBjb21wdXRlIGRpZmZlcmVuY2VcbmRiX2Z1bGw2bmV3JEJpb19NZWFuX0hSX2ZpeCA9IGlmX2Vsc2UoZGJfZnVsbDZuZXckc2NyZWVuY29udGVudCA9PSBcImZpeGF0aW9uXCIsIGRiX2Z1bGw2bmV3JEJpb19NZWFuX0hSLCBOVUxMKVxuXG4jIGNvbXB1dGUgaGVhcnQgcmF0ZSBkaWZmZXJlbmNlIHRvIGZpeGF0aW9uIHNjcmVlblxuXG5kYl9mdWxsNm5ld18zMDRfdXAkQmlvX01lYW5fSFJcblZpZXcoZGJfZnVsbDZuZXdfMzA0X3VwKVxuXG5kYl9mdWxsNm5ld18zMDRfdXA8LSBkYl9mdWxsNm5ld18zMDRfdXAlPiVcbiAgZ3JvdXBfYnkoc3NpZCklPiVcbiAgbXV0YXRlKEJJT19DREEuUGhhc2ljTWF4X3ogPSBzY2FsZShCSU9fQ0RBLlBoYXNpY01heClbLDFdKVxuXG5cblxucHVwdWxyZXNpZHRlc3Q8LSBsbWVyKHB1cF9iYXNDb3IgfiBCUklHSFRORVNTYyArKDErQlJJR0hUTkVTU2N8c3NpZCksIFJFTUwgPSBGQUxTRSxcbiAgICAgZGF0YSA9IHRlc3RyZXNpZGRmKVxuXG5zdW1tYXJ5KHB1cHVscmVzaWR0ZXN0KVxuXG5cbnBsb3QocHVwdWxyZXNpZHRlc3QpXG5cbnJlc2lkKHB1cHVscmVzaWR0ZXN0KVxudHN0cmVzaWQgPC0gcmVzaWQocHVwdWxyZXNpZHRlc3QpXG5cblxudGVzdHJlc2lkZGYkcHVvcGlsX3Jlc2lkIDwtIHRzdHJlc2lkXG5cbnRlc3RyZXNpZGRmPC0gc3Vic2V0KGRiX2Z1bGw2bmV3XzMwNF91cCwgIWlzLm5hKHB1cF9iYXNDb3IpKVxuXG5cbnN1bW1hcnkobG1lcihhcm91c2FsIH4gcHVwaWxfcmVzaWQgKyAoMXxzc2lkKSwgUkVNTCA9IEZBTFNFLFxuICAgICBkYXRhID0gdGVzdHJlc2lkZGYpKVxuXG5cblxuc3VtbWFyeShsbWVyKGFyb3VzYWwgfiBwdW9waWxfcmVzaWQgKyBCaW9fTWVhbl9IUitCSU9fQ0RBLlBoYXNpY01heCArICgxfHNzaWQpLFxuICAgICAgICAgICAgICAjICgwK3B1b3BpbF9yZXNpZCArIEJpb19NZWFuX0hSK0JJT19DREEuUGhhc2ljTWF4fHNzaWQpLCBcbiAgICAgICAgICAgICBSRU1MID0gRkFMU0UsXG4gICAgIGRhdGEgPSBzdWJzZXQodGVzdHJlc2lkZGYsIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNzaWQpKTw1MDApKSkgXG5cblxuc3Vic2V0KHRlc3RyZXNpZGRmLCBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihzc2lkKSk8NTAwKSU+JVxuICBncm91cF9ieShzc2lkKSU+JVxuICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JVxuICBnZ3Bsb3QoYWVzKGFyb3VzYWwsIEJJT19DREEuUGhhc2ljTWF4KSkrXG4gIGdlb21fcG9pbnQoKStcbiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKStcbiAgZ2dwdWJyOjpzdGF0X2NvcigpXG5cbnN1YnNldCh0ZXN0cmVzaWRkZiwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3NpZCkpPDUwMCklPiVcbiAgbXV0YXRlKG1lZGlhbl9ncm91bmRfYXJvdXNhbCA9IGlmX2Vsc2UoQXJvdXNhbE1lYW4+IG1lZGlhbihBcm91c2FsTWVhbiwgbmEucm0gPSBUUlVFKSwgXCJIaWdoXCIsIFwiTG93XCIpKSU+JVxuICBtdXRhdGUobWVkaWFuX2dyb3VuZF92YWxlbmNlID0gaWZfZWxzZShWYWxlbmNlTWVhbj4gbWVkaWFuKFZhbGVuY2VNZWFuLCBuYS5ybSA9IFRSVUUpLCBcIk1vcmUgcG9zaXRpdmVcIiwgXCJNb3JlIG5lZ2F0aXZlXCIpKSU+JVxuICBncm91cF9ieShzc2lkKSU+JVxuICB1bmdyb3VwKCklPiVcbiAgbXV0YXRlKG1lZGlhbl9zZWxmX2Fyb3VzYWwgPSBpZl9lbHNlKGFyb3VzYWw+IG1lZGlhbihhcm91c2FsKSwgXCJIaWdoXCIsIFwiTG93XCIpKSU+JVxuICBtdXRhdGUobWVkaWFuX3NlbGZfdmFsZW5jZSA9IGlmX2Vsc2UodmFsZW5jZT4gbWVkaWFuKHZhbGVuY2UpLCBcIlBvc2l0aXZlXCIsIFwiTmVnYXRpdmVcIikpJT4lXG5ncm91cF9ieShzc2lkLG1lZGlhbl9zZWxmX2Fyb3VzYWwsbWVkaWFuX3NlbGZfdmFsZW5jZSklPiVcbiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiVcbiAgZ2dwbG90KGFlcyhtZWRpYW5fc2VsZl9hcm91c2FsLCBwdW9waWxfcmVzaWQsKSkrXG4gIGdlb21faml0dGVyKHdpZHRoID0gLjIsIGFscGhhID0gLjIpK1xuICAgZ2VvbV9iYXIoc3RhdD1cInN1bW1hcnlcIiwgZnVuLnkgPSBcIm1lYW5cIiwgYWxwaGEgPSAuMikrXG4gIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKStcbiAgICBmYWNldF9ncmlkKH5tZWRpYW5fc2VsZl92YWxlbmNlKVxuICBnZ3B1YnI6OnN0YXRfY29yKClcbiAgXG4gIFxuICBcbiAgXG4gIHN1YnNldCh0ZXN0cmVzaWRkZiwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3NpZCkpPDUwMCklPiVcbiAgbXV0YXRlKG1lZGlhbl9ncm91bmRfYXJvdXNhbCA9IGlmX2Vsc2UoQXJvdXNhbE1lYW4+IG1lZGlhbihBcm91c2FsTWVhbiwgbmEucm0gPSBUUlVFKSwgXCJIaWdoXCIsIFwiTG93XCIpKSU+JVxuICBtdXRhdGUobWVkaWFuX2dyb3VuZF92YWxlbmNlID0gaWZfZWxzZShWYWxlbmNlTWVhbj4gbWVkaWFuKFZhbGVuY2VNZWFuLCBuYS5ybSA9IFRSVUUpLCBcIk1vcmUgcG9zaXRpdmVcIiwgXCJNb3JlIG5lZ2F0aXZlXCIpKSU+JVxuICBncm91cF9ieShzc2lkKSU+JVxuICBtdXRhdGUobWVkaWFuX3NlbGZfYXJvdXNhbCA9IGlmX2Vsc2UoYXJvdXNhbD4gbWVkaWFuKGFyb3VzYWwpLCBcIkhpZ2hcIiwgXCJMb3dcIikpJT4lXG4gIG11dGF0ZShtZWRpYW5fc2VsZl92YWxlbmNlID0gaWZfZWxzZSh2YWxlbmNlPiBtZWRpYW4odmFsZW5jZSksIFwiUG9zaXRpdmVcIiwgXCJOZWdhdGl2ZVwiKSklPiVcbmdyb3VwX2J5KHNzaWQsbWVkaWFuX3NlbGZfYXJvdXNhbCklPiVcbiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiVcbiAgICBzdWJzZXQoIWlzLm5hKG1lZGlhbl9zZWxmX2Fyb3VzYWwpKSU+JVxuICBnZ3Bsb3QoYWVzKG1lZGlhbl9zZWxmX2Fyb3VzYWwsIEJJT19DREEuUGhhc2ljTWF4X3opKStcbiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMiwgYWxwaGEgPSAuMikrXG4gICBnZW9tX2JhcihzdGF0PVwic3VtbWFyeVwiLCBmdW4ueSA9IFwibWVhblwiLCBhbHBoYSA9IC4yKStcbiAgICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLG1ldGhvZCA9ICdsbScsIHNlID0gRikrXG4gICAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gc3NpZCkpXG4gIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKVxuICAgIGZhY2V0X2dyaWQofm1lZGlhbl9zZWxmX3ZhbGVuY2UpXG4gIGdncHVicjo6c3RhdF9jb3IoKVxuICBcbiAgXG4gIHN1bW1hcnkobG1lcihhcm91c2FsIH4gbG9nKEJJT19DREEuUGhhc2ljTWF4Ky4xKSArICgxfHNzaWQpICsgKDErbG9nKEJJT19DREEuUGhhc2ljTWF4Ky4xKXxzdGltSUFQUyksXG4gICAgICAgICAgICAgICMgKDArcHVvcGlsX3Jlc2lkICsgQmlvX01lYW5fSFIrQklPX0NEQS5QaGFzaWNNYXh8c3NpZCksIFxuICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSxcbiAgICAgZGF0YSA9IHN1YnNldCh0ZXN0cmVzaWRkZiwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3NpZCkpPDUwMCAmQklPX0NEQS5BbXBTdW0+IC4xKSkpXG5cblxuXG5cblxuXG5gYGAifQ== -->
```r
# work on this
db_full6new_304_up$
colnames(db_full4new_stim_screen_pupil_nopract)
colnames(db_full6new_304_up)
# db_full6new
unique(db_full6new_304_up$screencontent)
View(db_full6new)
# store heart rate baseline to compute difference
db_full6new$Bio_Mean_HR_fix = if_else(db_full6new$screencontent == "fixation", db_full6new$Bio_Mean_HR, NULL)
# compute heart rate difference to fixation screen
db_full6new_304_up$Bio_Mean_HR
View(db_full6new_304_up)
db_full6new_304_up<- db_full6new_304_up%>%
group_by(ssid)%>%
mutate(BIO_CDA.PhasicMax_z = scale(BIO_CDA.PhasicMax)[,1])
pupulresidtest<- lmer(pup_basCor ~ BRIGHTNESSc +(1+BRIGHTNESSc|ssid), REML = FALSE,
data = testresiddf)
summary(pupulresidtest)
plot(pupulresidtest)
resid(pupulresidtest)
tstresid <- resid(pupulresidtest)
testresiddf$puopil_resid <- tstresid
testresiddf<- subset(db_full6new_304_up, !is.na(pup_basCor))
summary(lmer(arousal ~ pupil_resid + (1|ssid), REML = FALSE,
data = testresiddf))
summary(lmer(arousal ~ puopil_resid + Bio_Mean_HR+BIO_CDA.PhasicMax + (1|ssid),
# (0+puopil_resid + Bio_Mean_HR+BIO_CDA.PhasicMax|ssid),
REML = FALSE,
data = subset(testresiddf, as.numeric(as.character(ssid))<500)))
subset(testresiddf, as.numeric(as.character(ssid))<500)%>%
group_by(ssid)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(arousal, BIO_CDA.PhasicMax))+
geom_point()+
geom_smooth(method = 'lm', se = F)+
ggpubr::stat_cor()
subset(testresiddf, as.numeric(as.character(ssid))<500)%>%
mutate(median_ground_arousal = if_else(ArousalMean> median(ArousalMean, na.rm = TRUE), "High", "Low"))%>%
mutate(median_ground_valence = if_else(ValenceMean> median(ValenceMean, na.rm = TRUE), "More positive", "More negative"))%>%
group_by(ssid)%>%
ungroup()%>%
mutate(median_self_arousal = if_else(arousal> median(arousal), "High", "Low"))%>%
mutate(median_self_valence = if_else(valence> median(valence), "Positive", "Negative"))%>%
group_by(ssid,median_self_arousal,median_self_valence)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
ggplot(aes(median_self_arousal, puopil_resid,))+
geom_jitter(width = .2, alpha = .2)+
geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
stat_summary(geom = 'pointrange')+
facet_grid(~median_self_valence)
ggpubr::stat_cor()
subset(testresiddf, as.numeric(as.character(ssid))<500)%>%
mutate(median_ground_arousal = if_else(ArousalMean> median(ArousalMean, na.rm = TRUE), "High", "Low"))%>%
mutate(median_ground_valence = if_else(ValenceMean> median(ValenceMean, na.rm = TRUE), "More positive", "More negative"))%>%
group_by(ssid)%>%
mutate(median_self_arousal = if_else(arousal> median(arousal), "High", "Low"))%>%
mutate(median_self_valence = if_else(valence> median(valence), "Positive", "Negative"))%>%
group_by(ssid,median_self_arousal)%>%
summarise_if(is.numeric, mean, na.rm = TRUE)%>%
subset(!is.na(median_self_arousal))%>%
ggplot(aes(median_self_arousal, BIO_CDA.PhasicMax_z))+
geom_jitter(width = .2, alpha = .2)+
geom_bar(stat="summary", fun.y = "mean", alpha = .2)+
# geom_smooth(aes(group = ssid),method = 'lm', se = F)+
# geom_text(aes(label = ssid))
stat_summary(geom = 'pointrange')
facet_grid(~median_self_valence)
ggpubr::stat_cor()
summary(lmer(arousal ~ log(BIO_CDA.PhasicMax+.1) + (1|ssid) + (1+log(BIO_CDA.PhasicMax+.1)|stimIAPS),
# (0+puopil_resid + Bio_Mean_HR+BIO_CDA.PhasicMax|ssid),
REML = FALSE,
data = subset(testresiddf, as.numeric(as.character(ssid))<500 &BIO_CDA.AmpSum> .1)))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCgpEb3duc2FtcGxlIGRhdGEgdG8gc2F2ZSBzcGFjZQoKcHVwaWx0aW1lY291cnNlLmRhdGEgaXMgZG93c25hbXBsZWQgYnV0IGRvZXNuJ3QgaGF2ZSBhbGwgcGFydGljaXBhbnRzIDwgNDAwCgpidXQgdGhlIHNjcmlwdCBwdXBpbHRpbWVjb3Vyc2VleHAyLlJtZCBoYXMgd2hhdCB3ZSBuZWVkIHRvIGRvIHRoZSBzYW1lIGRvd3NuYW1wbGluZwoKR29hbAotIHRha2UgcHVwaWwgdGltZWNvdXJzZSwgZG93c25hbXBsZSBhbmQgdGhlbiBtcmdlIGl0IGl0IGJlaGF2aW91cmFsIGRhdGEgc28gdGhhdCB3ZSBjYW4gZG8gdGhlIGFkZGl0aW9uYWwgYXJvdXNhbCBwdXBpbCBhbmFseXNlcyB0aGF0IGNoZWNrIGZvciB0aW1lY291cnNlIHRoaW5ncy4KCgoKY2hlY2sgZ2F6ZVIgb3IgZG93bnNhbXBsaW5nCgoKdG8gZG8sIGRvIHRoZSBzYW1lIGFyb3VzYWwgY29ycmVsYXRpb24gd2l0aCB2YWxlbmNlCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQppbnN0YWxsLnBhY2thZ2VzKCJnYXplciIpCmxpYnJhcnkoZ2F6ZXIpCgo/Z2F6ZXI6OmRvd25zYW1wbGVfZ2F6ZQo/Z2F6ZXI6OmRvd25zYW1wbGVfcHVwaWwKCgp1bmlxdWUoWF90bXBfZGY0X2Z1bGwkQ29uZGl0aW9uKQojIGdhemVyOjpkb3duc2FtcGxlX2dhemUlCgp0bXAuZGY0X2Z1bGxfc3RpbTwtIFhfdG1wX2RmNF9mdWxsICU+JQogIHN1YnNldChzY3JlZW5jb250ZW50ID09ICJzdGltIikKCgojIGNyZWF0ZSBiaW5zCiMgaW5zdGFsbC5wYWNrYWdlcygiT25lUiIpCmluc3RhbGwucGFja2FnZXMoIk9uZVIiKQpsaWJyYXJ5KE9uZVIpCgo/YmluCgoKdG1wLmRmNF9mdWxsX3N0aW0kdGltZWJpbjwtIE9uZVI6OmJpbih0bXAuZGY0X2Z1bGxfc3RpbSR0aW1lcmV6ZXJvMywgbmJpbiA9IDYwKQoKCgojIGRvd3NhbXBsZSBieSBhdmVyYWdpbmc/CmNvbG5hbWVzKHRtcC5kZjRfZnVsbF9zdGltKQoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnMKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnMgPC0gdG1wLmRmNF9mdWxsX3N0aW0gJT4lCiAgZ3JvdXBfYnkoc3NpZCwgdE5vLCB0aW1lYmluLCB0cmlhbCx0cmlhbFVucSklPiUKICBzdW1tYXJpc2VfYXQoYygndGltZXJlemVybzMnLCdwdXBfYmFzQ29yJywgJ2dhemVfeF9jb3JfcGl4JywgJ2dhemVfeV9jb3JfcGl4JyksIAogICAgICAgICAgICAgICBtZWFuLCBuYS5ybSA9IFRSVUUpCgoKP3NhdmVSRFMKc2F2ZVJEUyh0bXAuZGY0X2Z1bGxfc3RpbV9kb3ducywgInRtcC5kZjRfZnVsbF9zdGltX2Rvd25zLnJkcyIpCgojIGNyZWF0ZSBrbGFyZ2VyIGJpbnMKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjEKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaAoKcmFuZ2UodG1wLmRmNF9mdWxsX3N0aW1fZG93bnMkdGltZXJlemVybzMpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHRpbWViaW4yIDwtIE9uZVI6OmJpbih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHRpbWVyZXplcm8zLCBuYmluID0gMzApCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiA8LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIGdyb3VwX2J5KHNzaWQsIHRObywgdGltZWJpbjIsIHRyaWFsLHRyaWFsVW5xKSU+JQogIHN1bW1hcmlzZV9hdChjKCd0aW1lcmV6ZXJvMycsJ3B1cF9iYXNDb3InLCAnZ2F6ZV94X2Nvcl9waXgnLCAnZ2F6ZV95X2Nvcl9waXgnKSwgCiAgICAgICAgICAgICAgIG1lYW4sIG5hLnJtID0gVFJVRSkKCm5yb3codG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIpCjg3NTI5CmBgYAoKCnB1cGlsIGFyb3VzYWwKCmBgYHtyfQpsaWJyYXJ5KGdnaGFsdmVzKQoKIyBwdXBpbCB0cmFja3MgYXJvdXNhbAoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBncm91bmRfYXJvdXNhbF9sYWIsIEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhncm91bmRfYXJvdXNhbF9sYWIsIHB1cF9iYXNDb3IsIGNvbG9yID0gZ3JvdW5kX2Fyb3VzYWxfbGFiLGZpbGwgPSBncm91bmRfYXJvdXNhbF9sYWIpKSsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyLCBhbHBoYSA9IC4yKSsKICMgZ2VvbV9oYWxmX3Zpb2xpbihjb2xvdXIgPSBGQUxTRSwgYWxwaGEgPSAuMywgc2l6ZSA9IDUpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgd2lkdGggPTEpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJBcm91c2FsIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKQogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKQogICMgZmFjZXRfZ3JpZCh+QlJJR0hUTkVTU19tZWRpYW5zcGxpdCkrCiAgeWxpbSgtNiwyLjMpCiAgCiAgCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9zZWxmX2Fyb3VzYWwsIEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsLCBwdXBfYmFzQ29yLCBjb2xvciA9IG1lZGlhbnNwbGl0X3NlbGZfYXJvdXNhbCxmaWxsID0gbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsKSkrCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMiwgYWxwaGEgPSAuMikrCiAjIGdlb21faGFsZl92aW9saW4oY29sb3VyID0gRkFMU0UsIGFscGhhID0gLjMsIHNpemUgPSA1KSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIHdpZHRoID0xKSsKICBwJGdyYXBoc3R5bGUrCiAgIyB4bGFiKCJBcm91c2FsIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkKICAjIGZhY2V0X2dyaWQofkJSSUdIVE5FU1NfbWVkaWFuc3BsaXQpKwogIHlsaW0oLTYsMi4zKQogIAptZWRpYW5zcGxpdF9zZWxmX2Fyb3VzYWxfdGhpc3NhbXBsZQogIAogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoc3NpZDwgNTAwKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICAgZ3JvdXBfYnkoc3NpZCwgbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsX3RoaXNzYW1wbGUsIEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2VfdGhpc3NhbXBsZSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9zZWxmX2Fyb3VzYWxfdGhpc3NhbXBsZSwgcHVwX2Jhc0NvciwgY29sb3IgPSBtZWRpYW5zcGxpdF9zZWxmX2Fyb3VzYWxfdGhpc3NhbXBsZSxmaWxsID0gbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsX3RoaXNzYW1wbGUpKSsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyLCBhbHBoYSA9IC4yKSsKICMgZ2VvbV9oYWxmX3Zpb2xpbihjb2xvdXIgPSBGQUxTRSwgYWxwaGEgPSAuMywgc2l6ZSA9IDUpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgd2lkdGggPTEpKwogIHAkZ3JhcGhzdHlsZSsKICAjIHhsYWIoIkFyb3VzYWwiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlX3RoaXNzYW1wbGUpCiAgIyBmYWNldF9ncmlkKH5CUklHSFRORVNTX21lZGlhbnNwbGl0KSsKICB5bGltKC02LDIuMykKICAKICAKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JT4lCiAgICAKICAgICBnZ3Bsb3QoYWVzKCB2YWxlbmNlLGFyb3VzYWwpKSsKICAgIGdlb21fcG9pbnQoKSsKICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHggKyBJKHheMiksIHNpemUgPSAxKSsKICAgIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfYXJvdXNhbCkKICAgICMgZ2VvbV9zbW9vdGgoYWVzKHggPSBhcm91c2FsXjIsIHkgPSB2YWxlbmNlKSkKICAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCU+JQogICAgCiAgICBnZ3Bsb3QoYWVzKCB2YWxlbmNlLGFyb3VzYWwpKSsKICAgIGdlb21fcG9pbnQoKSsKICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0geSB+IHggKyBJKHheMiksIHNpemUgPSAxKSsKICAgIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkKICAgCiAgIAogICB1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRzc2lkKQpgYGAKICAKYGBge3J9CiMgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlIGlzIGR1b2xpYXRpbmcgdGhlIHN0aW11bGkgYmFzZWQgaW9uIHBlb3BsIHdobyBjaG9vc2UgbmVnYXRpdmUgYW5kIHBvc2l0aXZlCnVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0KQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0IDwtIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QlPiUKICB1bmdyb3VwKCklPiUKICAjIGdyb3VwX2J5KHN0aW1JQVBTKSU+JQogIG11dGF0ZShtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIgPSBpZl9lbHNlKFZhbGVuY2VNZWFuVGhpc1NhbXBsZSA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbihWYWxlbmNlTWVhblRoaXNTYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksICJNb3JlIHBvc2l0aXZlIiwgIk1vcmUgbmVnYXRpdmUiKSklPiUKICBtdXRhdGUobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyID0gaWZfZWxzZShBcm91c2FsTWVhblRoaXNTYW1wbGUgPj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4oQXJvdXNhbE1lYW5UaGlzU2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLCAiSGlnaCIsICJMb3ciKSkKICAKICAKICBncm91cF9ieShtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsIHN0aW1JQVBTLHN0aW1EZXNjcmlwdGlvbiklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKQoKYGBgCgogIAogIApicmlnaHRuZXNzCgpgYGB7cn0KdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyU+JQogIGdyb3VwX2J5KHN0aW1JQVBTKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhWYWxlbmNlTWVhbiwgTWVhbl9ncmF5X3opKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JT4lCiAgZ3JvdXBfYnkoc3RpbUlBUFMpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKEFyb3VzYWxNZWFuLCBNZWFuX2dyYXlfeikpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKQoKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcgJT4lCiAgZ3JvdXBfYnkoc3RpbUlBUFMsZ3JvdW5kX3ZhbGVuY2VfbGFiKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhncm91bmRfdmFsZW5jZV9sYWIsIE1lYW5fZ3JheV96KSkrCiAgZ2VvbV9wb2ludCgpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgCiAgdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyAlPiUKICBncm91cF9ieShzdGltSUFQUyxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIE1lYW5fZ3JheV96KSkrCiAgIyBnZW9tX3BvaW50KCkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICAKICAKICAKICAgIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcgJT4lCiAgZ3JvdXBfYnkoc3RpbUlBUFMsZ3JvdW5kX3ZhbGVuY2VfbGFiKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhNZWFuX2dyYXlfeiwgY29sb3IgPSBncm91bmRfdmFsZW5jZV9sYWIpKSsKICAgICAgIyBnZW9tX2hpc3RvZ3JhbSgpKwogICAgICBnZW9tX2RlbnNpdHkoKQogICMgZ2VvbV9wb2ludCgpKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSksZ2VvbSA9ICdsaW5lJykKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKQogIAogIAogIAogIAogICMgCiAgCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcgJT4lCiAgZ3JvdXBfYnkoc3RpbUlBUFMsbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBBcm91c2FsTWVhbikpKwogICAgICAjIGdlb21faGlzdG9nIGB2cmFtKCkKICAgICAgIyBnZW9tX2RlbnNpdHkoKQogICMgZ2VvbV9wb2ludCgpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKQogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAjIGdncHVicjo6c3RhdF9jb3IoKQogICAgICAKICAgICAgCiAgICAgIGdyb3VuZF92YWxlbmNlX2xhYgpgYGAKCiAgClBhcnRpY2lwYW50cyBzZWN0aW9uCgpgYGB7cn0KcGFydGljaXBhbnRzX2RlbW9nIDwtIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgICAjIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChHcm91cCA9PSAiTlQiKSU+JQogIGdyb3VwX2J5KHNzaWQsIEdlbmRlciklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKQoKdW5pcXVlKHBhcnRpY2lwYW50c19kZW1vZykKCiMgZ2VuZGVyCnRhYmxlKHBhcnRpY2lwYW50c19kZW1vZyRHZW5kZXIpCgoKY29sbmFtZXMocGFydGljaXBhbnRzX2RlbW9nKQpwc3ljaDo6ZGVzY3JpYmUocGFydGljaXBhbnRzX2RlbW9nW2MoIkFnZSIpXSkKCnN1bW1hcnkocGFydGljaXBhbnRzX2RlbW9nJEFnZSkKCnNkKHBhcnRpY2lwYW50c19kZW1vZyRBZ2UsIG5hLnJtID0gVFJVRSkKCgoKdGFibGUoaXMubmEocGFydGljaXBhbnRzX2RlbW9nJEFnZSkpCgoKcGFydGljaXBhbnRzX2RlbW9nICU+JQogIGdyb3VwX2J5KEdlbmRlciklPiUKICBtdXRhdGUoZ2VuZGVyc3BlY2lmX2FnZSA9IHNkKFRBUykpJT4lCiAgdW5ncm91cCgpJT4lCiAgbXV0YXRlKG5vbmdlbmRlcnNwZWNpZl9hZ2UgPSBzZChUQVMpKSU+JQogIGdyb3VwX2J5KEdlbmRlciklPiUKICBzdW1tYXJpc2VfYXQoYygiZ2VuZGVyc3BlY2lmX2FnZSIsIm5vbmdlbmRlcnNwZWNpZl9hZ2UiKSwgbWVhbiwgbmEucm0gPSBUUlVFKQoKCigxMC41NTcxNDArOC4wNDI3NDMpLzIKCjguMDQyNzQzCgo5LjI5OTk0MQoKYGBgCgoKCiAgCiAgCmBgYHtyfQogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoR3JvdXAgPT0gIk5UIiklPiUKICAjIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCwgQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBwdXBfYmFzQ29yLCBjb2xvciA9IG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLGZpbGwgPSBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCkpKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDIsIGFscGhhID0gLjIpKwogIyBnZW9tX2hhbGZfdmlvbGluKGNvbG91ciA9IEZBTFNFLCBhbHBoYSA9IC4zLCBzaXplID0gNSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBhbHBoYSA9IC4xLCBzaXplID0gMSwgY29sb3VyID0gIkJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnLCB3aWR0aCA9MSkrCiAgcCRncmFwaHN0eWxlKwogICMgeGxhYigiQXJvdXNhbCIpKwogICMgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkKICAjIGZhY2V0X2dyaWQofkJSSUdIVE5FU1NfbWVkaWFuc3BsaXQpKwogIHlsaW0oLTYsMi4zKQpgYGAKCiAgCiAgCmBgYHtyfQogIAogICAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCwgQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBNZWFuLCBjb2xvciA9IG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLGZpbGwgPSBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCkpKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDIsIGFscGhhID0gLjIpKwogIyBnZW9tX2hhbGZfdmlvbGluKGNvbG91ciA9IEZBTFNFLCBhbHBoYSA9IC4zLCBzaXplID0gNSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBhbHBoYSA9IC4xLCBzaXplID0gMSwgY29sb3VyID0gIkJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnLCB3aWR0aCA9MSkrCiAgcCRncmFwaHN0eWxlKwogICMgeGxhYigiQXJvdXNhbCIpKwogICMgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgIyBmYWNldF9ncmlkKH5CUklHSFRORVNTX21lZGlhbnNwbGl0KSsKICB5bGltKDkwLDEzMCkKICAKICAKYGBgCiAgCiAgCiAgb2theSBsZXQncyBjcmVhdGUgYXZlcmFnZXMgZnJpbyB0aGlzIGVudGlyZSBzYW1wbGUgYW5kIHVzZSB0aG9zZSB0byBkZXZpZGUgdGhlIHN0aW11bGkKICAKICBzZWxmIGFyb3B1c2FsIG1pZ2h0IGJlIGJpYXNlZCBieSBwcm9ibGVtYXRpYyBmb2xrcyBidXQgYXZlcmFnZXMgZm9yIHRoZSBlbnRpcmUgc2FtcGxlIHNob3VsZCBub3QKICAKYGBge3J9CgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIGdyb3VwX2J5KHN0aW1JQVBTKSU+JQogIG11dGF0ZSgpCgoKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBzZWxmX2Fyb3VzYWxfbGFiLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoc2VsZl9hcm91c2FsX2xhYiwgcHVwX2Jhc0NvciwgY29sb3IgPSBzZWxmX2Fyb3VzYWxfbGFiLGZpbGwgPSBzZWxmX2Fyb3VzYWxfbGFiKSkrCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMiwgYWxwaGEgPSAuMikrCiAjIGdlb21faGFsZl92aW9saW4oY29sb3VyID0gRkFMU0UsIGFscGhhID0gLjMsIHNpemUgPSA1KSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIHdpZHRoID0xKSsKICBwJGdyYXBoc3R5bGUrCiAgIyB4bGFiKCJBcm91c2FsIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkKICAKICAKc2FtcGxlX2lhcHNfYXJvdXNhbDwtICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgCiAgICBncm91cF9ieShzdGltSUFQUyklPiUKICAgIHN1YnNldChzc2lkX251bTwgNTAwKSU+JQogICAgc3VtbWFyaXNlX2F0KGMoJ0Fyb3VzYWxNZWFuVGhpc1NhbXBsZScsJ0Fyb3VzYWxNZWFuJyksIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgIGdncGxvdChhZXMoQXJvdXNhbE1lYW5UaGlzU2FtcGxlLCBBcm91c2FsTWVhbikpKwogICAgZ2VvbV9wb2ludCgpKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAgIGdncHVicjo6c3RhdF9jb3IoKSsKICAgIHRoZW1lX2NsYXNzaWMoKQogIAogIHNhbXBsZV9pYXBzX3ZhbDwtICAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICAgIAogICAgIGdyb3VwX2J5KHN0aW1JQVBTKSU+JQogICAgc3Vic2V0KHNzaWRfbnVtPCA1MDApJT4lCiAgICBzdW1tYXJpc2VfYXQoYygnVmFsZW5jZU1lYW5UaGlzU2FtcGxlJywnVmFsZW5jZU1lYW4nKSwgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICAgZ2dwbG90KGFlcyhWYWxlbmNlTWVhblRoaXNTYW1wbGUsIFZhbGVuY2VNZWFuKSkrCiAgICBnZW9tX3BvaW50KCkrCiAgICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogICAgZ2dwdWJyOjpzdGF0X2NvcigpKwogICAgICB0aGVtZV9jbGFzc2ljKCkKCmxpYnJhcnkocGF0Y2h3b3JrKQpzYW1wbGVfaWFwc19hcm91c2FsKwpzYW1wbGVfaWFwc192YWwKYGBgCgoKICAKCiAgCmBgYHtyfSAKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBzZWxmX2Fyb3VzYWxfbGFiLCBBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKHNlbGZfYXJvdXNhbF9sYWIsIHB1cF9iYXNDb3IsIGNvbG9yID0gc2VsZl9hcm91c2FsX2xhYixmaWxsID0gc2VsZl9hcm91c2FsX2xhYikpKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDIsIGFscGhhID0gLjIpKwogIyBnZW9tX2hhbGZfdmlvbGluKGNvbG91ciA9IEZBTFNFLCBhbHBoYSA9IC4zLCBzaXplID0gNSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBhbHBoYSA9IC4xLCBzaXplID0gMSwgY29sb3VyID0gIkJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnLCB3aWR0aCA9MSkrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIkFyb3VzYWwiKSsKICB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkKICAjIGZhY2V0X2dyaWQofkJSSUdIVE5FU1NfbWVkaWFuc3BsaXQpKwogIHlsaW0oLTYsMi4zKQoKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICBncm91cF9ieShzc2lkLCBncm91bmRfYXJvdXNhbF9sYWIsIEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhncm91bmRfYXJvdXNhbF9sYWIsIHB1cF9iYXNDb3IsIGNvbG9yID0gZ3JvdW5kX2Fyb3VzYWxfbGFiLGZpbGwgPSBncm91bmRfYXJvdXNhbF9sYWIpKSsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyLCBhbHBoYSA9IC4yKSsKICMgZ2VvbV9oYWxmX3Zpb2xpbihjb2xvdXIgPSBGQUxTRSwgYWxwaGEgPSAuMywgc2l6ZSA9IDUpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgd2lkdGggPTEpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJBcm91c2FsIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKQogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKQogICMgZmFjZXRfZ3JpZCh+QlJJR0hUTkVTU19tZWRpYW5zcGxpdCkrCiAgeWxpbSgtNiwyLjMpCgoKYGBgCgpSZXNwb3NuZSBiaWFzCmBgYHtyfQpsaWJyYXJ5KGdnRXh0cmEpCmFyb3VzX3B1cF9ieV92YWw8LSBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgc3RpbUlBUFMsIG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoYXJvdXNhbF9jLCBwdXBfYmFzQ29yKSkrCiAgICAgIGdlb21fcG9pbnQoYWxwaGEgPSAuMikrCiAgICAjIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJBcm91c2FsIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpCiAgIyBnZ3B1YnI6OnN0YXRfY29yKCkKICB5bGltKC0zLjMsMS4zKQoKICBhcm91c19wdXBfYnlfdmFsPC0gYXJvdXNfcHVwX2J5X3ZhbCtnZ3NpZGU6Omdlb21feHNpZGVkZW5zaXR5KGFlcyh5PXN0YXQoZGVuc2l0eSksZmlsbCA9IG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSksIGFscGhhID0gLjQpCiAgICAKICBhcm91c19wdXBfYnlfdmFsK2dnc2lkZTo6Z2VvbV95c2lkZWRlbnNpdHkoYWVzKHg9c3RhdChkZW5zaXR5KSxmaWxsID0gbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSwgYWxwaGEgPSAuNCkKICAKICAKZ2dNYXJnaW5hbChhcm91c19wdXBfYnlfdmFsLCB0eXBlID0gImRlbnNpdHkiKQpgYGAKCmNlaWxpaW5nIGVmZmVjdD8KCmBgYHtyfQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgc3RpbUlBUFMsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsX2MsIHB1cF9iYXNDb3IpKSsKICAgICAgZ2VvbV9wb2ludCgpKwogICAgIyBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBwJGdyYXBoc3R5bGUrCiAgeGxhYigiQXJvdXNhbCIpKwogIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogIGdncHVicjo6c3RhdF9jb3IoKSsKICB5bGltKC0zLjMsMS4zKQoKCmBgYAoKY2VpbGluZyBlZmZlY3Q/CmBgYHtyfQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgbXV0YXRlKHB1cF9iYXNDb3JfbWVhbiA9IG1lYW4ocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc2RfcHVwID0gc2QocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc3ViaiA9IG4oKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBwdXBfYmFzQ29yKSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuNCwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAjIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICB5bGltKC0zLjMsMS4zKQogIAogIApgYGAKICAKICAKYGBge3J9ICAKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgbXV0YXRlKHB1cF9iYXNDb3JfbWVhbiA9IG1lYW4ocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc2RfcHVwID0gc2QocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc3ViaiA9IG4oKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBwdXBfYmFzQ29yKSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuNCwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAjIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICB5bGltKC0zLjMsMS4zKQogIAogIAogIAogIAogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICAjIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICMgbXV0YXRlKHB1cF9iYXNDb3JfbWVhbiA9IG1lYW4ocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc2RfcHVwID0gc2QocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc3ViaiA9IG4oKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAjIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICMgbXV0YXRlKHB1cF9iYXNDb3Jfc2UgPSBzZF9wdXAvKHNxcnQoc3ViaikpKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlLCBwdXBfYmFzQ29yKSkrCiAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40LCBjb2xvciA9IEZBTFNFKSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuNSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCgogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAjIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICB5bGltKC0zLjMsMS4zKQogIAogIAogIApgYGAKCgpgYGB7cn0KCiMgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRhcm91c2FsX291dGxlcgogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9zZSA9IHNkX3B1cC8oc3FydChzdWJqKSkpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIGFyb3VzYWwpKSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgc3RhdF9zdW1tYXJ5KCBnZW9tID0gJ3BvaW50cmFuZ2UnLCBhbHBoYSA9IC41LCBzaXplID0gMSwgY29sb3VyID0gIkJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICAjIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBwdXBfYmFzQ29yX21lYW4tcHVwX2Jhc0Nvcl9zZSwgeW1heCA9IHB1cF9iYXNDb3JfbWVhbitwdXBfYmFzQ29yX3NlICkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIlZhbGVuY2UiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCgojIHN0aW0KICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgZ3JvdXBfYnkoc3RpbUlBUFMsIG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSwgbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NlbGZfYXJvdXNhbCwgYXJvdXNhbCkpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoIGdlb20gPSAncG9pbnRyYW5nZScsIGFscGhhID0gLjUsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKICAjIGdyb3VuZAogIAogICMgc3RpbQogIAogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBncm91cF9ieShzdGltSUFQUywgbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBBcm91c2FsTWVhbikpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoIGdlb20gPSAncG9pbnRyYW5nZScsIGFscGhhID0gLjUsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCgpgYGAKICAKICAKICAgIAoKCm90ZWhyIGNvbmZvdW5kcyAtIGV5ZSBtb3ZlbWVudHMKCmBgYHtyfQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChzc2lkPCA1MDApJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX21lYW4gPSBtZWFuKHB1cF9iYXNDb3IsIG5hLnJtID0gVFJVRSksIHNkX3B1cCA9IHNkKHB1cF9iYXNDb3IsIG5hLnJtID0gVFJVRSksIHN1YmogPSBuKCkpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAjIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICMgbXV0YXRlKHB1cF9iYXNDb3Jfc2UgPSBzZF9wdXAvKHNxcnQoc3ViaikpKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIG1lYW5fZml4X2R1cikpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICAjIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBwdXBfYmFzQ29yX21lYW4tcHVwX2Jhc0Nvcl9zZSwgeW1heCA9IHB1cF9iYXNDb3JfbWVhbitwdXBfYmFzQ29yX3NlICkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIlZhbGVuY2UiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIyBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgeWxpbSgtMy4zLDEuMykKICAKICAKICAKICAgdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkVmFsZW5jZU1lYW5UaGlzU2FtcGxlKQogICAKICAgCiAgIG1lZGlhbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JFZhbGVuY2VNZWFuVGhpc1NhbXBsZSkKICAgIG1lZGlhbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHZhbGVuY2UpCiAgICAKICAgIAogICAgIG1lZGlhbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JGFyb3VzYWwpCiAgICBtZWRpYW4oZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRBcm91c2FsTWVhblRoaXNTYW1wbGUpCiAgCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoc3NpZDwgNTAwKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9tZWFuID0gbWVhbihwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzZF9wdXAgPSBzZChwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzdWJqID0gbigpKSU+JQogIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9zZSA9IHNkX3B1cC8oc3FydChzdWJqKSkpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UsIG1lYW5fZml4X2R1cikpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICAjIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBwdXBfYmFzQ29yX21lYW4tcHVwX2Jhc0Nvcl9zZSwgeW1heCA9IHB1cF9iYXNDb3JfbWVhbitwdXBfYmFzQ29yX3NlICkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIlZhbGVuY2UiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIyBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgeWxpbSgtMy4zLDEuMykKICAKYGBgCgpgYGB7cn0KICAjIGRhdGEgbG9zcyBnYXplCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoc3NpZDwgNTAwKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9tZWFuID0gbWVhbihwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzZF9wdXAgPSBzZChwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzdWJqID0gbigpKSU+JQogIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBmaXhfY291bnQpKSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICMgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogIGdncHVicjo6c3RhdF9jb3IoKQogIHlsaW0oLTMuMywxLjMpCiAgCiAgCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoc3NpZDwgNTAwKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9tZWFuID0gbWVhbihwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzZF9wdXAgPSBzZChwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzdWJqID0gbigpKSU+JQogIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBTYWNBbXApKSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICMgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogIGdncHVicjo6c3RhdF9jb3IoKQogIHlsaW0oLTMuMywxLjMpCiAgCiAgCiAgCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXI9PSBGQUxTRSklPiUKICBzdWJzZXQoc3NpZDwgNTAwKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9tZWFuID0gbWVhbihwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzZF9wdXAgPSBzZChwdXBfYmFzQ29yLCBuYS5ybSA9IFRSVUUpLCBzdWJqID0gbigpKSU+JQogIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBncm91cF9ieShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3NlID0gc2RfcHVwLyhzcXJ0KHN1YmopKSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBzZGV2Z2F6ZSkpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICAjIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBwdXBfYmFzQ29yX21lYW4tcHVwX2Jhc0Nvcl9zZSwgeW1heCA9IHB1cF9iYXNDb3JfbWVhbitwdXBfYmFzQ29yX3NlICkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIlZhbGVuY2UiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIyBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgeWxpbSgtMy4zLDEuMykKICAKICAKIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICAjIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICMgbXV0YXRlKHB1cF9iYXNDb3JfbWVhbiA9IG1lYW4ocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc2RfcHVwID0gc2QocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc3ViaiA9IG4oKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9zZSA9IHNkX3B1cC8oc3FydChzdWJqKSkpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgZ2F6ZV9sb3NzX3Byb3ApKSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgIyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcHVwX2Jhc0Nvcl9tZWFuLXB1cF9iYXNDb3Jfc2UsIHltYXggPSBwdXBfYmFzQ29yX21lYW4rcHVwX2Jhc0Nvcl9zZSApKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJWYWxlbmNlIikrCiAgIyB5bGFiKCJCYXNlbGluZSBjb3JyZWN0ZWQgcHVwaWwiKSsKCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICMgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogIGdncHVicjo6c3RhdF9jb3IoKQogIHlsaW0oLTMuMywxLjMpCiAgCiAgCiAgCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICAjIGdyb3VwX2J5KG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICMgbXV0YXRlKHB1cF9iYXNDb3JfbWVhbiA9IG1lYW4ocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc2RfcHVwID0gc2QocHVwX2Jhc0NvciwgbmEucm0gPSBUUlVFKSwgc3ViaiA9IG4oKSklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgIyBtdXRhdGUocHVwX2Jhc0Nvcl9zZSA9IHNkX3B1cC8oc3FydChzdWJqKSkpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgdG90YWxfZml4X2R1cikpKwogIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCwgY29sb3IgPSBGQUxTRSkrCiAgICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhPS4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgYWxwaGEgPSAuMSwgc2l6ZSA9IDEsIGNvbG91ciA9ICJCbGFjayIpICsKICAjIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBwdXBfYmFzQ29yX21lYW4tcHVwX2Jhc0Nvcl9zZSwgeW1heCA9IHB1cF9iYXNDb3JfbWVhbitwdXBfYmFzQ29yX3NlICkpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIlZhbGVuY2UiKSsKICAjIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIyBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgCmBgYAoKIyBsZXQncyBtb2RlbCBpdCBmb3JtYWxseQogIAojIHJlbWVtYmVyIGJhc2VsaW5lIGNvcmVjdGlvbiBpcyBlcXVpdmFsZW5kdCB0byBzdGltdWxpIGludGVyY2VwdAogCmBgYHtyfSAKcHVwaWxfYXJvdXNhbF9maW5kaW5nczwtIGxpc3QoKQpsaWJyYXJ5KGxtZXJUZXN0KQoKdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3Qkc3RpbUlBUFMpCnVuaXF1ZShzdWJzdHIoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRzdGltSUFQUywgMSw4KSkKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRMYWJlbDwtIHN1YnN0cihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHN0aW1JQVBTLCAxLDgpCiAgCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3Q8LSBsZWZ0X2pvaW4oZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgaW1hZ2VKX0lBUFMsIGJ5ID0gIkxhYmVsIikKbnJvdyhkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0KQojIHJvd3MgPSAyODU4CgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JE1lYW5fZ3JheV96PC0gc2NhbGUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRNZWFuLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXQoKb3B0aW9ucyhjb250cmFzdHMgPSBjKCJjb250ci5zdW0iLCJjb250ci5wb2x5IikpCm9wdGlvbnMoc2NpcGVuID0gOTk5KQoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRzc2lkX251bSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHNzaWQpKQoKcHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2Fyb3VzYWwgPC0gbG1lcihwdXBfYmFzQ29yIH4gYXJvdXNhbF9jKk1lYW5fZ3JheV96ICArKDEgK01lYW5fZ3JheV96IHwgc3NpZCkgKyAoMCthcm91c2FsX2N8IHNzaWQpLCBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBzc2lkX251bTwgNTAwICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpKQoKc3VtbWFyeShwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJvdXNhbCkKIyBzaW5ndWxhcml0eSAoZHJvcCBhcm91c2FsIGMgc2xvcGUpCgojIGlzIHRoZXJlIGEgY29vcmVsYXRpb25idHdlZW4gbWVhbiBhcm91c2FsIHJhdGluZyBhbmQgbWVhZ3JheSgKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QlPiUKICBncm91cF9ieShzdGltSUFQUyxncm91bmRfdmFsZW5jZV9sYWIpICU+JQogIHN1bW1hcmlzZV9hdChjKCdhcm91c2FsX2MnLCAnTWVhbl9ncmF5X3onKSwgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoYXJvdXNhbF9jLCBNZWFuX2dyYXlfeiwgY29sb3IgPSBncm91bmRfdmFsZW5jZV9sYWIpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKIyA8LSBwcmVkaWN0KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcm91c2FsKQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIGdyb3VwX2J5KHN0aW1JQVBTKSAlPiUKICAjIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgIyBzdW1tYXJpc2VfYXQoYygnYXJvdXNhbF9jJywgJ01lYW5fZ3JheV96JyksIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKGFyb3VzYWxfYywgcHVwKSkrCiAgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gc3NpZCwgYWxwaGEgPSBzc2lkKSwgbWV0aG9kID0gJ2xtJywgc2UgPSBGKQojIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHN0aW1JQVBTKSwgbWV0aG9kID0gJ2xtJywgc2UgPSBGKQogIGdncHVicjo6c3RhdF9jb3IoKQoKCmBgYApjb3IudGVzdChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JCwgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCQpCgoKYGBge3J9CiMgaWYgd2UgcHV0IGJyaWdodGVuZXNzIGFuZCBhcm91c2FsIHdlIHNlZSBubyBpbnRlcmFjdGlvbiB3aGljaCBtZWFucyB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGJyaWdodGVuZXNzLCBpdCBkb2Vzbid0IGNoYW5nZSBlZmZlY3RzIG9mIGFyb3VzYWwgc2VsZiByZXBvcnQKIyBkYl9mdWxsNG5ld19zdGltX3B1cGlsJHB1cApwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJvdXNhbCA8LSBsbWVyKHB1cF9iYXNDb3IgfiBhcm91c2FsX2MrTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSwgUkVNTCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHB1cCwgcHVwaWxfb3V0bGllciA9PSBGQUxTRSAmIHNzaWRfbnVtPCA1MDAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFKSkKCmluc3RhbGwucGFja2FnZXMoJ3VzZG0nKQoKdXNkbTo6dmlmKGFzLmRhdGEuZnJhbWUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdFssYygnYXJvdXNhbCcsICd2YWxlbmNlJyldKSkKCnB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcm91c2FsX3dpdGh2YWwgPC0gbG1lcihwdXBfYmFzQ29yIH4gYXJvdXNhbF9jKnZhbGVuY2VfYyogTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSwgUkVNTCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0LCBwdXBpbF9vdXRsaWVyID09IEZBTFNFICYgc3NpZF9udW08IDUwMCYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpKQoKc3VtbWFyeShwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJvdXNhbF93aXRodmFsKQpjYXI6OnZpZihwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJvdXNhbF93aXRodmFsKQoKbG1lclRlc3Q6OnN0ZXAocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2Fyb3VzYWxfd2l0aHZhbCkKCgoKIyBjb250cm9sIGZvciBiYXNlbGluZSBhcm91c2FsIHJhdGluZ3MKCnB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcm91c2FsX3dpdGh2YWwKCnN1bW1hcnkobG1lcihwdXBfYmFzQ29yIH4gYXJvdXNhbF9jKnZhbGVuY2VfYysgTWVhbl9ncmF5X3ogICsoMSB8IHNzaWQpICsgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAjICgxfEFyb3VzYWxNZWFuKSsgKDF8QXJvdXNhbE1lYW4pLCBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBHcm91cCA9PSAiTlQiICAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFKSkpCgoKCiMgYXJvdXNhbF9jOnZhbGVuY2VfYyAgICAgICAgICAgICAgICAgICAgICAwICAzNS41MiAgIDM1LjUyICAgICAxIDIxNTAuMTkgIDEzLjU3NjAgMC4wMDAyMzQ4ICoqKgoKCnB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkYXJvdXNhbF9mcm9tX3B1cGlsIDwtIGxtZXIoYXJvdXNhbCB+IHB1cF9iYXNDb3IgKiBNZWFuX2dyYXlfeiAgKygxK3B1cF9iYXNDb3IgIHwgc3NpZCksIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgcHVwaWxfb3V0bGllciA9PSBGQUxTRSAmIHNzaWQhPSA2MTAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFKSkKCnN1bW1hcnkocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91c2FsX2Zyb21fcHVwaWwpCiMgd2hhdCBhYm91dCB2YWxlbmNlCgpwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fdmFsZW5jZSA8LSBsbWVyKHB1cF9iYXNDb3IgfiB2YWxlbmNlX2MrTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgK3ZhbGVuY2VfYyB8IHNzaWQpLCBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBzc2lkIT0gNjEwJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm91c2FsX291dGxlciA9PSBGQUxTRSkpCgpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcm91c2FsKQpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV92YWxlbmNlKQoKCmBgYAoKCiMgVmFsZW5jZSBhbmQgYXJvdXNhbApgYGB7cn0KCnB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcl92YWxlIDwtIGxtZXIocHVwX2Jhc0NvciB+ICh2YWxlbmNlX2MqIGFyb3VzYWxfYykgKyBNZWFuX2dyYXlfeiAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMCsgdmFsZW5jZV9jKiBhcm91c2FsX2MgfCBzc2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBzc2lkX251bTwgNTAwICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpKQoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCR0b3RhbF9maXhfZHVyX3o8LSBzY2FsZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHRvdGFsX2ZpeF9kdXIsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSlbLDFdCgpwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJfdmFsX2dhemUgPC0gbG1lcihwdXBfYmFzQ29yIH4gKHZhbGVuY2VfYyAqIGFyb3VzYWxfYyAqIHRvdGFsX2ZpeF9kdXJfeikrIE1lYW5fZ3JheV96ICArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMCsgIHRvdGFsX2ZpeF9kdXJfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgcHVwaWxfb3V0bGllciA9PSBGQUxTRSAmIHNzaWRfbnVtPCA1MDAgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm91c2FsX291dGxlciA9PSBGQUxTRSkpCgpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcl92YWxfZ2F6ZSApCnN1bW1hcnkocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbGUpCgoKY2FyOjp2aWYocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbF9nYXplKQoKYW5vdmEocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbGUsIHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcm91c2FsKQojIGludGVyYWN0aW9uIHZhbGVuY2UgYW5kIGFyb3VzYWwKCgoKYGBgCgoKCmNvbnRyb2wgZm9yIGdhemUKCmBgYHtyfQojIGF2ZyBmaXggZHVyCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkbWVhbl9maXhfZHVyX3o8LSBzY2FsZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JG1lYW5fZml4X2R1ciwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKVssMV0KCnB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcl92YWxfZ2F6ZSA8LSBsbWVyKHB1cF9iYXNDb3IgfiAodmFsZW5jZV9jICogYXJvdXNhbF9jICogbWVhbl9maXhfZHVyX3opKyBNZWFuX2dyYXlfeiAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxICsgTWVhbl9ncmF5X3ogfCBzc2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKDArICB0b3RhbF9maXhfZHVyX3ogfCBzc2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBzc2lkX251bTwgNTAwICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpKQoKc3VtbWFyeShwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJfdmFsX2dhemUgKQppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbF9nYXplICwgcHJlZCA9IGFyb3VzYWxfYywgbW9keCA9IG1lYW5fZml4X2R1cl96KQoKCiMgZml4IGNvdW50CgoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRmaXhfY291bnRfejwtIHNjYWxlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkZml4X2NvdW50LCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXQoKcHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbF9nYXplIDwtIGxtZXIocHVwX2Jhc0NvciB+ICh2YWxlbmNlX2MgKiBhcm91c2FsX2MgKiBmaXhfY291bnRfeikrIE1lYW5fZ3JheV96ICArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMCsgIHRvdGFsX2ZpeF9kdXJfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgcHVwaWxfb3V0bGllciA9PSBGQUxTRSAmIHNzaWRfbnVtPCA1MDAgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm91c2FsX291dGxlciA9PSBGQUxTRSkpCgpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcl92YWxfZ2F6ZSApCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbF9nYXplICwgcHJlZCA9IGFyb3VzYWxfYywgbW9keCA9IG1lYW5fZml4X2R1cl96KQpgYGAKCgpgYGB7cn0KaW50ZXJhY3Rpb25zOjppbnRlcmFjdF9wbG90KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkcHVwaWxfZnJvbV9hcl92YWxlICwgcHJlZCA9IHZhbGVuY2VfYywgbW9keCA9IGFyb3VzYWxfYykKCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJHB1cGlsX2Zyb21fYXJfdmFsZSAsIHByZWQgPWFyb3VzYWxfYyAsIG1vZHggPSAgdmFsZW5jZV9jKQoKY2FyOjp2aWYocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRwdXBpbF9mcm9tX2FyX3ZhbGUpICNjdXJvZmYgMi41PwoKY29yLnRlc3QoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCR2YWxlbmNlX2MsIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkYXJvdXNhbF9jKQoKcm1jb3JyX3ZhbGVuY2VfYXJvdXNhbCA8LSBybWNvcnI6OnJtY29ycihwYXJ0aWNpcGFudCA9ICJzc2lkIiwgbWVhc3VyZTEgPSAidmFsZW5jZV9jIiwgbWVhc3VyZTIgPSAiYXJvdXNhbF9jIiwgZGF0YSA9IGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QpCgpwbG90KHJtY29ycl92YWxlbmNlX2Fyb3VzYWwpCgo/cm1jb3JyCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIGdyb3VwX2J5KHN0aW1JQVBTKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhBcm91c2FsTWVhbiwgVmFsZW5jZU1lYW4pKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkrCiAgdGhlbWVfY2xhc3NpYygpCgoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBncm91cF9ieShzdGltSUFQUyklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoYXJvdXNhbF9jLCB2YWxlbmNlX2MpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkrCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCgoKCgpgYGB7cn0KIyB3aXRoIGFyb3VzYWwgYXMgRFYKcHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91YWxfZnJvbV9wdXAgPC0gbG1lcihhcm91c2FsIH4gdmFsZW5jZV9jKnB1cF9iYXNDb3IgKiAgQlJJR0hUTkVTU2MgICsgKDF8IHN0aW1JQVBTKSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3NpZCkrKDAgK3ZhbGVuY2VfYyB8IHNzaWQpLCBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBzc2lkIT0gNjEwJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm91c2FsX291dGxlciA9PSBGQUxTRSkpCnN1bW1hcnkocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91YWxfZnJvbV9wdXApCgphbm92YShwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJGFyb3VhbF9mcm9tX3B1cCkKCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91YWxfZnJvbV9wdXAgLCBwcmVkID0gdmFsZW5jZV9jLCBtb2R4ID0gcHVwX2Jhc0NvcikKCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChwdXBpbF9hcm91c2FsX2ZpbmRpbmdzJGFyb3VhbF9mcm9tX3B1cCwgcHJlZCA9cHVwX2Jhc0NvciAsIG1vZHggPSAgdmFsZW5jZV9jKQojIGZvciBwb3NpdGl2ZSB2YWxlbmNlZCBzdGltdWxpIHBhcnRpY2lwYW50cyByZXBvcnRlIGhpZ2hlciBhcm91c2FsIHRvIG1vcmUgZGlsYXRlZCBwdXBpbHMKI2ZvciBuZWdhdGl2ZWx5IHZhbGVuY2UgdGhleSByZXBvcnQgZmVlbGluZyBuZWdhdGl2ZSBldmVuIHdoZW4gdGhleSBkb24ndCBzaG93IHN0cm9nIHB1cGlsIGRpbGF0aW9uCiMgc2FtZSBwYXR0ZXJuCiMgcHVwaWwgaXMgbW9yZSBhbGlnaG5lZCB3aXRoIG9iamVjdGl2ZSBhcm91c2FsIGluIHRoZSBwb3NpdGl2ZSB0cmlhbHMKCmBgYAoKbWl4ZWQgbW9kZWwgaXMgY29uc2lzdGVudCB3dGggdGhlIHByZXZpb3VzIHBsb3QsIGFyb3VzYWwgZWZmZWN0cyBvbiBwdXBpbCBpcyBtb2R1bGF0ZWQgYnkgdmFsZW5jZS4gaW4gb3RoZXIgd29yZHMgdGhlcmUgaXMgYSBjb25zaXN0ZW50IGVmZmVjdCBiZXR3ZWVuIHB1cGlsIGFuZCBzZWxmLXJlcG90IG9mIGFyb3VzYWwgbW9yZSBmb3IgcG9zaXRpdmUgZW1vdGlvbnMuCgoKYW5hbHlzZSB0aGUgY29ycmVsYXRpb25sYSB3YXkKc2luY2Ugd2UgYXJlIGFnZ3JlZ2F0aW5nIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgdG9vIG11Y2ggYWJvdXQgYnJpZ2h0ZW5lc3MgYXMgZXZlcnkgcGVyc29uIHNlZXMgZXZlcnkgc3RpbXVsaSBpbiBhbGwgYnJpZ2h0bmVzcyBsZXZlbHMKQ09OQ09SREFOQ0UKCmBgYHtyfQoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZV90aGlzc2FtcGxlLCBzdGltSUFQUyklPiUKICBzdW1tYXJpc2VfYXQoYygiYXJvdXNhbCIsICd2YWxlbmNlJyksIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBhcnJhbmdlKHN0aW1JQVBTKQoKCgpgYGAKCmBgYGB7cn0KCnRlc3RfYW5vdmFzPC0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICAgIyBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBpc192YWxlbmNlX2hpZ2gpJT4lCiAgIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMixtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpJT4lCiAgICBtdXRhdGUoY29ydGVzdCA9IGNvcihhcm91c2FsX2MsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSkKCgogZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICAgIyBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBpc192YWxlbmNlX2hpZ2gpJT4lCiAgIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMixtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpJT4lCiAgICBtdXRhdGUoY29ydGVzdCA9IGNvcihhcm91c2FsX2MsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiwgY29ydGVzdCwgY29sb3IgPSBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpKSsKICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQpKwogIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgICAgICAgc3RhdF9zdW1tYXJ5KCBnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgICAgICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IC4xKSsKICAgIHlsYWIoIlIgcHVwaWwgdnMgc2VsZiByZXBvcnQgYXJvdXNhbCIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMiwgbGluZXR5cGUgPSAnZGFzaGVkJywgYWxwaGEgPSAuMikrCiAgICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVFJVRSkrCiAgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpCiAgCiAgCiAgCiAgCiAgIyBsZXQncyBpZGVudGlmeSB0aGUgZm9sa3MgdGhhdCBzaG93IGxlc3Mgb2YgYSBkaWZmZXJlbmNlIGJldHdlZW4gY29uZGl0aW9ucy4KCmZsYWdfcG9zX25lZzwtICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCggYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UgJiAhaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgICAjIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIGlzX3ZhbGVuY2VfaGlnaCklPiUKICAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSU+JQogICAgbXV0YXRlKGNvcnRlc3QgPSBjb3IudGVzdChhcm91c2FsX2MsIHB1cF9iYXNDb3IpJGVzdGltYXRlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgIG11dGF0ZShjb3JfcG9zX25lZ19kaWZmID0gY29ydGVzdFttZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIgPT0gIk1vcmUgcG9zaXRpdmUiXSAtCiAgICAgICAgICAgICBjb3J0ZXN0W21lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiA9PSAiTW9yZSBuZWdhdGl2ZSJdKSU+JQogICAgbXV0YXRlKGNvcl9wb3NfbmVnX2RpZmZfbGFiID0gaWZfZWxzZShjb3JfcG9zX25lZ19kaWZmPjAsICJwb3MgPiBuZWciLCAibmVnID4gcG9zIikpJT4lCiAgICAgZ3JvdXBfYnkoc3NpZCxjb3JfcG9zX25lZ19kaWZmX2xhYiklPiUKICAgIHN1bW1hcmlzZV9hdChjKCJjb3JfcG9zX25lZ19kaWZmIiksIG1lYW4sIG5hLnJtID0gVFJVRSkKICAgIAogICAgCiAgICAjIHN1YnNldChjb3JfcG9zX25lZ19kaWZmPD0gMCklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiwgY29ydGVzdCwgY29sb3IgPSBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpKSsKICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQpKwogIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgICAgICAgc3RhdF9zdW1tYXJ5KCBnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgICAgICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IC4xKSsKICAgIHlsYWIoIlIgcHVwaWwgdnMgc2VsZiByZXBvcnQgYXJvdXNhbCIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMiwgbGluZXR5cGUgPSAnZGFzaGVkJywgYWxwaGEgPSAuMikKICAgIyBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucyhwYWlyZWQgPSBUUlVFKSsKICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpCiAgCmBgYAoKCmBgYHtyfQp0ZXN0Y29yIDwtY29yKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkYXJvdXNhbCwgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCR2YWxlbmNlKSAKICAKdGVzdGNvciAKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICAgIyBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBpc192YWxlbmNlX2hpZ2gpJT4lCiAgIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiwgbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSU+JQogICAgIyBtdXRhdGUoY29ydGVzdCA9IGNvci50ZXN0KGFyb3VzYWxfYywgcHVwX2Jhc0NvcikkZXN0aW1hdGUpJT4lCiAgIG11dGF0ZShjb3J0ZXN0ID0gY29yKGFyb3VzYWxfYywgcHVwX2Jhc0NvciwgbWV0aG9kID0gJ2tlbmRhbGwnKSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgICAgICAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsIGNvcnRlc3QsIGNvbG9yID0gbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSkrCiAgICAgICAgICAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40KSsKICAKICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhID0gLjEpKwogICAgICAgIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgICAgICAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAuMSkrCiAgICB5bGFiKCJSIHB1cGlsIHZzIHNlbGYgcmVwb3J0IGFyb3VzYWwiKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjIsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGFscGhhID0gLjIpCiAgICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVFJVRSkrCiAgIyBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpCiAgCiAgCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCggYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UgJiAhaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgICAjIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIGlzX3ZhbGVuY2VfaGlnaCklPiUKICAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyLCBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpJT4lCiAgICAjIG11dGF0ZShjb3J0ZXN0ID0gY29yLnRlc3QoYXJvdXNhbF9jLCBwdXBfYmFzQ29yKSRlc3RpbWF0ZSklPiUKICAgbXV0YXRlKGNvcnRlc3QgPSBjb3IodmFsZW5jZV9jLCBwdXBfYmFzQ29yLCBtZXRob2QgPSAna2VuZGFsbCcpKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiwgY29ydGVzdCwgY29sb3IgPSBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpKSsKICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQpKwogIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgICAgICAgc3RhdF9zdW1tYXJ5KCBnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgICAgICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IC4xKSsKICAgIHlsYWIoIlIgcHVwaWwgdnMgc2VsZiByZXBvcnQgYXJvdXNhbCIpKwogIHRoZW1lX2NsYXNzaWMoKSsKICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMiwgbGluZXR5cGUgPSAnZGFzaGVkJywgYWxwaGEgPSAuMikKCmBgYAogIAoKIyBzYW1lIGFzIHBsb3QgYWJvdmUgYnV0IHdpdGggdmFsZW5jZSBpbiB0aGUgY29ycmVsYXRpb24KYGBge3J9CmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCBhcm91c2FsX291dGxlciA9PSBGQUxTRSAmICFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPDUwMCklPiUKICAgICMgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgaXNfdmFsZW5jZV9oaWdoKSU+JQogICBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpJT4lCiAgICBtdXRhdGUoY29ydGVzdCA9IGNvci50ZXN0KHZhbGVuY2VfYywgcHVwX2Jhc0NvcikkZXN0aW1hdGUpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogICAgICAgIGdncGxvdChhZXMobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyLCBjb3J0ZXN0LCBjb2xvciA9IG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikpKwogICAgICAgICAgIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCkrCiAgCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYSA9IC4xKSsKICAgICAgICBzdGF0X3N1bW1hcnkoIGdlb20gPSAncG9pbnRyYW5nZScpKwogICAgICAgICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gLjEpKwogICAgeWxhYigiUiBwdXBpbCB2cyBzZWxmIHJlcG9ydCBhcm91c2FsIikrCiAgdGhlbWVfY2xhc3NpYygpCiAgICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVFJVRSkrCiAgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoKQogIAogIApgYGAKICAKYGBge3J9CiMgZ3JvdW5kCgogZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICAgIyBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBpc192YWxlbmNlX2hpZ2gpJT4lCiAgIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICAgbXV0YXRlKGNvcnRlc3QgPSBjb3IudGVzdChhcm91c2FsX2MsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpJGVzdGltYXRlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBjb3J0ZXN0LCBjb2xvciA9IG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSkrCiAgICAgICAgICAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40KSsKICAKICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhID0gLjMpKwogICAgICAgIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgICAgICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gLjEpKwogICAgeWxhYigiUiBwdXBpbCB2cyBzZWxmIHJlcG9ydCBhcm91c2FsIikrCiAgICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVFJVRSkrCiAgIyBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpCiAgIHRoZW1lX2NsYXNzaWMoKQpgYGAKIAoKCmBgYHtyfQogIyBncm91bmQgYXJvdXNhbCB3aXRoIHZhbGVuY2UgaW4gdGhlICBjb3JlbGF0aW9uCiAKIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCBhcm91c2FsX291dGxlciA9PSBGQUxTRSAmICFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPDUwMCklPiUKICAgICMgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgaXNfdmFsZW5jZV9oaWdoKSU+JQogICBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAgIG11dGF0ZShjb3J0ZXN0ID0gY29yLnRlc3QodmFsZW5jZV9jLCBwdXBfYmFzQ29yLCB1c2UgPSAiY29tcGxldGUiKSRlc3RpbWF0ZSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgICAgICAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgY29ydGVzdCwgY29sb3IgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpKwogICAgICAgICAgIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuNCkrCiAgCiAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYSA9IC4zKSsKICAgICAgICBzdGF0X3N1bW1hcnkoIGdlb20gPSAncG9pbnRyYW5nZScpKwogICAgICAgIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IC4xKSsKICAgIHlsYWIoIlIgcHVwaWwgdnMgc2VsZiByZXBvcnQgYXJvdXNhbCIpKwogICAjIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKHBhaXJlZCA9IFRSVUUpKwogICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoKQogICB0aGVtZV9jbGFzc2ljKCkKCgoKCiBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCggYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UgJiAhaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgICAjIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIGlzX3ZhbGVuY2VfaGlnaCklPiUKICAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsKSU+JQogICAgbXV0YXRlKGNvcnRlc3QgPSBjb3IudGVzdChhcm91c2FsX2MsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpJGVzdGltYXRlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBjb3J0ZXN0LCBjb2xvciA9IG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSkrCiAgICAgICAgICAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC40KSsKICAKICAgIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhID0gLjMpKwogICAgICAgIHN0YXRfc3VtbWFyeSggZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgICAgICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gLjEpKwogICAgeWxhYigiUiBwdXBpbCB2cyBzZWxmIHJlcG9ydCBhcm91c2FsIikrCiAgICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMocGFpcmVkID0gVFJVRSkrCiAgIyBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpCiAgIHRoZW1lX2NsYXNzaWMoKSsKICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwpCgpgYGAKCiAKYGBge3J9CmRiX3B1cGlsX2NvbmNvcmRhbmNlX2FnZ19ncm91bmQgPC0gIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UpJT4lCiAgc3Vic2V0KCBhcm91c2FsX291dGxlciA9PSBGQUxTRSAmICFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPDUwMCklPiUKICAgICMgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgaXNfdmFsZW5jZV9oaWdoKSU+JQogICBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICAgIG11dGF0ZShjb3J0ZXN0ID0gY29yLnRlc3QoYXJvdXNhbF9jLCBwdXBfYmFzQ29yLCB1c2UgPSAiY29tcGxldGUiKSRlc3RpbWF0ZSklPiUKICAgIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpCgphZmV4Ojphb3ZfZXooaWQgPSAic3NpZCIsCiAgICAgICAgICAgICBkYXRhID0gZGJfcHVwaWxfY29uY29yZGFuY2VfYWdnLAogICAgICAgICAgICAgYmV0d2VlbiA9IE5VTEwsCiAgICAgICAgICAgICB3aXRoaW4gPSAnbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UnLAogICAgICAgICAgICAgZHYgPSAnY29ydGVzdCcpCgoKdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkdE5vKQpkYl9wdXBpbF9jb25jb3JkYW5jZV9hZ2dfc2VsZiA8LSAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICAjIHN1YnNldChHcm91cCA9PSAiTlQiKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgICAjIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIGlzX3ZhbGVuY2VfaGlnaCklPiUKICAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpJT4lCiAgICBtdXRhdGUoY29ydGVzdCA9IGNvcihhcm91c2FsX2MsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSkKCmFmZXg6OmFvdl9leihpZCA9ICJzc2lkIiwKICAgICAgICAgICAgIGRhdGEgPSB0ZXN0X2Fub3ZhcywKICAgICAgICAgICAgIGJldHdlZW4gPSBOVUxMLAogICAgICAgICAgICAgd2l0aGluID0gJ21lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMicsCiAgICAgICAgICAgICBkdiA9ICdjb3J0ZXN0JykKCgphZmV4Ojphb3ZfZXooaWQgPSAic3NpZCIsCiAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRlc3RfYW5vdmFzLCBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIgPT0gIk1vcmUgcG9zaXRpdmUiKSwKICAgICAgICAgICAgIGJldHdlZW4gPSBOVUxMLAogICAgICAgICAgICAgd2l0aGluID0gJ21lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMicsCiAgICAgICAgICAgICBkdiA9ICdjb3J0ZXN0JykKCgphZmV4Ojphb3ZfZXooaWQgPSAic3NpZCIsCiAgICAgICAgICAgICBkYXRhID0gZGJfcHVwaWxfY29uY29yZGFuY2VfYWdnX3NlbGYsCiAgICAgICAgICAgICBiZXR3ZWVuID0gTlVMTCwKICAgICAgICAgICAgIHdpdGhpbiA9ICdtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZScsCiAgICAgICAgICAgICBkdiA9ICdjb3J0ZXN0JykKCiMgdmFsZW5jZSBhbmQgYXJvdXNhbAoKCmFmZXg6OmFvdl9leihpZCA9ICJzc2lkIiwKICAgICAgICAgICAgIGRhdGEgPSB0ZXN0X2Fub3ZhcywKICAgICAgICAgICAgIGJldHdlZW4gPSBOVUxMLAogICAgICAgICAgICAgd2l0aGluID0gYygnbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyJywnbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyJyksCiAgICAgICAgICAgICBkdiA9ICdjb3J0ZXN0JykKCgoKCgpkYl9wYXJzZWRfZl9zdW1tPC0gZGJfcGFyc2VkX2YgJT4lCiAgZ3JvdXBfYnkodE5vLCBzc2lkKSU+JQogIHN1bW1hcmlzZV9hdChjKCdEdXJhdGlvbicsICdtZWFuX3gnLCAnbWVhbl95JyksIHN1bSwgbmEucm0gPSBUUlVFKQogIGdncGxvdChhZXModE5vLCBEdXJhdGlvbikpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICBnZW9tX3BvaW50KGFscGhhID0gLjEpCgoKdW5pcXVlKGRiX3BhcnNlZF9mX3N1bW0kc3NpZCkKdW5pcXVlKGRiX3BhcnNlZF9mX3N1bW0kdE5vKQp1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCR0Tm8pCnVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHNzaWQpCm5yb3coZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCkKbnJvdyhkYl9wYXJzZWRfZl9zdW1tKQoKdGFibGUoaXMubmEoZGJfcGFyc2VkX2Zfc3VtbSRzc2lkKSkKCmRiX3BhcnNlZF9mX3N1bW0kdG90YWxfZml4X2R1cjwtIGRiX3BhcnNlZF9mX3N1bW0kRHVyYXRpb24KCgpkYl9wYXJzZWRfZl9zdW1tJHRObzwtIGFzLmNoYXJhY3RlcihkYl9wYXJzZWRfZl9zdW1tJHRObykKZGJfcGFyc2VkX2Zfc3VtbSRzc2lkPC0gYXMuY2hhcmFjdGVyKGRiX3BhcnNlZF9mX3N1bW0kc3NpZCkKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCREdXJhdGlvbjwtIE5VTEwKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCR0b3RhbF9maXhfZHVyPC0gTlVMTAoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdDwtIGxlZnRfam9pbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0LCBkYl9wYXJzZWRfZl9zdW1tKQogIApgYGAKCgpJIEhBVkUgVEhFIElNUFJFU1NJT04gVEhBVCBXSEFUIFRISVMgQU5BTFlTRVMgR0lWRVMgVVMgSVMgVEhFIFNBTUUgQVMgVEhFIE1JWEVEIE1PREVMIEFTIFRISVMgQ09OQ0lPUkRBTkNFIENBTiBCRSBFWFBSRVNTRUQgSU4gVEVSTVMgRk8gVEhFIFNMT1BFIE9GIFRIRSBBT1VTQUwgQU5EIFBVUElMIFJFTEFUSU9OCgoKU08gSU9OIE9USEVSIFdPUkRTIElTIG5vdCB0aGF0IHB1cGlsIHRyYWNrc3ZhbGVuY2UgaXMgdGhhdCBhcm91c2FsIGJhc2VkIHB1cGlsIGlzIG1vZHVsYXRlZCBieSB2YWxlbmNlCgpieSB3aHkgaXMgdGhhdAotIGJpYXMgaXMgcmVzcG9uZGluZz8gZWcuLiBwZW9wbGUgcmVzcG9uc2UgdGhleSBmZWVsIG5lZ2F0aXZlIGV2ZW4gd2hlbiB0aGV5IGRvbid0IChpZS4gd2hlbiB3ZSBoYXZlIG5vIG9iamVjdGl2ZSBpbmRpY2F0b3IgdGhhdCB0aGV5IGRvIGZlZWwpCi0gaXMgaXQgc29tZXRoaW5nIGFib3V0IHRoZSBzdGltdWxpLCBwb3NpdGl2ZSBhcm91c2FsIGlzIHNleHVhbCBoZXJlPwotIG9yIGFyb3VzYWwgaW50ZXJmZXJlcyB3aXRoIGFwcHJhaXNhbC4gaGlnaCBhcm91c2luZyBzdGltdWxpIGFyZSBkaXN0cmFjdGluZz8/CgoKCnRpbWVjb3Vyc2UgbW9kZWxzIG9mIHB1cGlsCgoKCgoKCgpQdXBpbCB0cmFja3MgdmFsZW5jZQoKYGBge3J9CgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9Bbm9wcmFjdCAlPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUocHVwX2Jhc0Nvcl96ID0gc2NhbGUocHVwX2Jhc0NvciwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKSklPiUKICAgIGdyb3VwX2J5KHNzaWQsIGdyb3VuZF92YWxlbmNlX2xhYiwgQWxleGl0aHltaWEpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoZ3JvdW5kX3ZhbGVuY2VfbGFiLCBwdXBfYmFzQ29yX3osZmlsbCA9IGdyb3VuZF92YWxlbmNlX2xhYikpKwogZ2VvbV9oYWxmX3Zpb2xpbihjb2xvdXIgPSBGQUxTRSwgYWxwaGEgPSAuMywgc2l6ZSA9IDUpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIHdpZHRoID0xKSsKICAgICMgZ2VvbV95c2lkZWRlbnNpdHkoYWVzKHg9c3RhdChkZW5zaXR5KSxjb2xvciA9IGdyb3VuZF92YWxlbmNlX2xhYiksIGFscGhhID0gLjQpKwogIHAkZ3JhcGhzdHlsZSsKICB4bGFiKCJ2YWxlbmNlIikrCiAgeWxhYigiQmFzZWxpbmUgY29ycmVjdGVkIHB1cGlsIikrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpCgoKbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlCgoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCAlPiUKICAjIHN1YnNldChwcF9hcm91c2FsX291dGxlcj09IEZBTFNFKSU+JQogIHN1YnNldChwdXBpbF9vdXRsaWVyID09IEZBTFNFKSU+JQogIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIHN1YnNldChzc2lkX251bTw1MDApJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICAjIG11dGF0ZShwdXBfYmFzQ29yX3ogPSBzY2FsZShwdXBfYmFzQ29yLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpKSU+JQogICAgZ3JvdXBfYnkoc3NpZCwgc2VsZl9hcm91c2FsX2xhYiwgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKHNlbGZfYXJvdXNhbF9sYWIsIHB1cF9iYXNDb3IsZmlsbCA9IHNlbGZfYXJvdXNhbF9sYWIpKSsKIGdlb21faGFsZl92aW9saW4oY29sb3VyID0gRkFMU0UsIGFscGhhID0gLjMsIHNpemUgPSA1KSsKICAgICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGE9LjIpKwogICAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnLCBhbHBoYSA9IC4xLCBzaXplID0gMSwgY29sb3VyID0gIkJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnLCB3aWR0aCA9MSkrCiAgICAjIGdlb21feXNpZGVkZW5zaXR5KGFlcyh4PXN0YXQoZGVuc2l0eSksY29sb3IgPSBncm91bmRfdmFsZW5jZV9sYWIpLCBhbHBoYSA9IC40KSsKICBwJGdyYXBoc3R5bGUrCiAgeGxhYigiYXJvdXNhbCIpKwogIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpCgoKCgoKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyPT0gRkFMU0UpJT4lCiAgc3Vic2V0KHNzaWQ8IDUwMCklPiUKICBzdWJzZXQocHVwaWxfb3V0bGllciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICAgIGdyb3VwX2J5KHNzaWQsIHNlbGZfYXJvdXNhbF9sYWIsIEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoc2VsZl9hcm91c2FsX2xhYiwgcHVwX2Jhc0NvciwgY29sb3IgPSBzZWxmX2Fyb3VzYWxfbGFiLGZpbGwgPSBzZWxmX2Fyb3VzYWxfbGFiKSkrCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMiwgYWxwaGEgPSAuMikrCiAjIGdlb21faGFsZl92aW9saW4oY29sb3VyID0gRkFMU0UsIGFscGhhID0gLjMsIHNpemUgPSA1KSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjQsIGNvbG9yID0gRkFMU0UpKwogICAgICBnZW9tX2ppdHRlcih3aWR0aCA9IC4xLCBhbHBoYT0uMikrCiAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjEsIHNpemUgPSAxLCBjb2xvdXIgPSAiQmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScsIHdpZHRoID0xKSsKICBwJGdyYXBoc3R5bGUrCiAgeGxhYigiQXJvdXNhbCIpKwogIHlsYWIoIkJhc2VsaW5lIGNvcnJlY3RlZCBwdXBpbCIpKwoKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKQogICMgZmFjZXRfZ3JpZCh+QlJJR0hUTkVTU19tZWRpYW5zcGxpdCkrCiAgeWxpbSgtNiwyLjMpCiAgCiAgCiAgCiAgCiAgCiAgCnRhYmxlKGlzLm5hKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSkKYGBgCgoKCmNvbWJpbmUgdGltZWNvdXJzZQoKCmxldCdzIHB1dCBwdXBpbCBzY3IgYW5kIGh0IHByZWRpY3Rpb24gb24gc3ViamVjdGl2ZSBhcm91c2FsCgoKCmBgYHtyfQpybShqdXN0b25lX3Rlc3QsIGx1Y3lfcGxvdHMsIHRlc3QpCgojIGltcG9ydCB0aGUgdGltZWNvdXJzZQp1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMSkKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgyJAoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMSA8LSByZWFkUkRTKCJ+L09uZURyaXZlIC0gTmV4dXMzNjUvSW50ZXJvU3R1ZHkyMDIwL2FuYWx5c2lzL0RhdGFBbmFseXNpc0phbnVhcnkyMDIwL0RhdGFBbmFseXNpc0phbjIwMjAvdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMS5yZHMiKQoKCiMgbWVyZ2Ugd2l0aCBiZWhhdmlvdXJhbCBkYXRhCnVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JHNzaWQpCmNvbG5hbWVzKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QpCmNvbG5hbWVzKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjEpCgpkYl9mdWxsNG5ld19zdGltCmNvbG5hbWVzKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QpCmRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0PC0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdFssYygxOjQsNjo3LDEyOjEzLDE2LDIxOjI3LCAzMTo1Niw4MDo4MSw4NDo5Niw5ODoxMTQsMTE2OjEyNCldCgoKIyBtYXRjaCB0eXBlcyBvZiBtZXJnaW5nIHZhcmlhYmxlcwp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiRzc2lkPC0gYXMuY2hhcmFjdGVyKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgyJHNzaWQpCgpkYl9mdWxsNG5ld19zdGltX3N1YnNldCRzc2lkPC0gYXMuY2hhcmFjdGVyKGRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JHNzaWQpCgojIHRObwoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIkdE5vIDwtIGFzLmNoYXJhY3Rlcih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiR0Tm8pCmRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JHRObyA8LSBhcy5jaGFyYWN0ZXIoZGJfZnVsbDRuZXdfc3RpbV9zdWJzZXQkdE5vKQp1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zdWJzZXQkdE5vKQp1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIkdE5vKQojIG1lcmdlCm5yb3codG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIpCiMgMTcyMTY4CiMgODc1MjkKCnRhYmxlKGlzLm5hKGRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiR0Tm88LSBhcy5udW1lcmljKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgyJHRObykKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDI8LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiU+JQogIGFycmFuZ2Uoc3NpZCx0Tm8sIHRpbWVyZXplcm8zKQoKCmRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JHQKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDwtIGxlZnRfam9pbih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiwgZGJfZnVsbDRuZXdfc3RpbV9zdWJzZXQpCgoKdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JHN0aW1JQVBTKQoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIkdHJpYWxVbnEKCnVuaXF1ZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoMiRzc2lkKQp1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zdWJzZXQkc3NpZCkKCgpkYl9mdWxsNG5ld19zdGltX3N1YnNldCR0Tm88LSBhcy5udW1lcmljKGRiX2Z1bGw0bmV3X3N0aW1fc3Vic2V0JHRObykKCgp0YWJsZShpcy5uYShkYl9mdWxsNG5ld19zdGltX3N1YnNldCRhcm91c2FsKSkKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXc8LSByaWdodF9qb2luKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgyLCBkYl9mdWxsNG5ld19zdGltX3N1YnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ3NzaWQnLCAndE5vJykpCgpucm93KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgpCiMgMTcyMTY4IGdvb2QKCm5yb3codG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIpCgpucm93KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcpCjg3NTI5Cgp0YWJsZShpcy5uYSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkpCgpzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywgaXMubmEoYXJvdXNhbCkpCgp1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaDIkdHJpYWxVbnEpCgpgYGAKCgpgYGB7cn0KIyBjaGVjawp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEoZ3JvdW5kX2Fyb3VzYWxfbGFiKSklPiUKICBnZ3Bsb3QoYWVzKHggPSB0aW1lcmV6ZXJvMywgeSA9IHB1cF9iYXNDb3IpKSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9IGdyb3VuZF9hcm91c2FsX2xhYiwgY29sb3IgPSBncm91bmRfYXJvdXNhbF9sYWIpLCBmdW4gPSBtZWFuLGdlb20gPSAibGluZSIsCiAgICAgICAgICAgICAgIHNlID0gRiwgYWxwaGEgPSAuMSwgc2l6ZSA9IDEuNSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPWdyb3VuZF9hcm91c2FsX2xhYiwgY29sb3IgPSBncm91bmRfYXJvdXNhbF9sYWIpLCBzaXplID0gMykrICAKdGhlbWVfY2xhc3NpYygpKwogIHlsYWIoIlB1cGlsIHNpemUgKHopIikrCiAgeGxhYigiVGltZSAocykiKSsKICAjIHAkZ3JhcGhzdHlsZSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIHhsaW0oMCw2KSsKICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKQoKCgoKCgpgYGAKCnB1cGlsIHRpbWVjb3Vyc2UKCmBgYHtyfQoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCAlPiUKICBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikpJT4lCiAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpKSU+JQogIGdncGxvdChhZXMoeCA9IHRpbWVyZXplcm8zLCB5ID0gcHVwX2Jhc0NvcikpKwogIHN0YXRfc21vb3RoKGFlcyhncm91cD0gbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLCBjb2xvciA9IG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiksIGZ1biA9IG1lYW4sZ2VvbSA9ICJsaW5lIiwKICAgICAgICAgICAgICAgc2UgPSBGLCBhbHBoYSA9IC4xLCBzaXplID0gMS41KSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLCBjb2xvciA9IG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiksIHNpemUgPSAzKSsgIAp0aGVtZV9jbGFzc2ljKCkrCiAgeWxhYigiUHVwaWwgc2l6ZSAoeikiKSsKICB4bGFiKCJUaW1lIChzKSIpKwogICMgcCRncmFwaHN0eWxlKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgeGxpbSgwLDYpKwogICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpCgoKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWggJT4lCiAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lCiAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGltZXJlemVybzMsIHkgPSBwdXBfYmFzQ29yKSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPSBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCwgY29sb3IgPSBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCksIGZ1biA9IG1lYW4sZ2VvbSA9ICJsaW5lIiwKICAgICAgICAgICAgICAgc2UgPSBGLCBhbHBoYSA9IC4xLCBzaXplID0gMS41KSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9bWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwsIGNvbG9yID0gbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwpLCBzaXplID0gMykrICAKdGhlbWVfY2xhc3NpYygpKwogIHlsYWIoIlB1cGlsIHNpemUgKHopIikrCiAgeGxhYigiVGltZSAocykiKSsKICAjIHAkZ3JhcGhzdHlsZSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIHhsaW0oMCw2KSsKICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpCgpgYGAKCgp1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCRjb25kaXRpb24pCgpgYGB7cn0KdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCR2YWxlbmNlYXJvdXNhbF9vdXRsaWVyczwtIGlmX2Vsc2UodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCRBcm91c2FsTWVhbjwgNi43ICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCRtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSA9PSAiTW9yZSBuZWdhdGl2ZSIsIFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJEFyb3VzYWxNZWFuPiAyLjk0ICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCRtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSA9PSAiTW9yZSBwb3NpdGl2ZSIsIFRSVUUsIEZBTFNFKSkKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogICMgc3Vic2V0KHZhbGVuY2Vhcm91c2FsX291dGxpZXJzID09IFRSVUUpICU+JQogIGdyb3VwX2J5KHN0aW1JQVBTLG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgQXJvdXNhbE1lYW4pKSsKICAjIGdlb21fYm94cGxvdCgpKwogICMgZ2VvbV9wb2ludCgpKwogICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0aW1JQVBTKSkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDcuMikrCiAgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA2LjcpKwogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyLjk0KQoKCiAgCgojIHRoaXNtcGxvdCByYWlzZXMgcXVlc3Rpb24gcmVnYXJkaW5nIHd0aHRlaHIgdGhlIGJldHRlciBjb3JyZWxhdGlvbiBid3RlZW4gc3ViamVjdGl2ZSBhbmQgb2JqZWN0aXZlIGFyb3VzYWwgZm9yIHBvc2l0aXZlIHN0b211bGkgcmVmbGVjdHMgdGhlIGZhY3QgdGhhdCBmb3IgbmVnYXRpdmUgd2UgZG9uJ3QgaGF2ZSBtYW55IGxvdyBhcm91c2FsIG9uZXMuIEJ1dCB0aGlzIGlzIHVubGlrZWxseSBiZWNhdXNlIHRoZSBvcG9zaXRlIHVzIGFsc28gdHJ1ZSBmb3IgcG9zaXR1aXZlIHN0aW11bGksIG5vdG1hbnkgcG9zaXRpdmUgc3RvbXVsaSBhcmUgcmF0ZWQgYXMgaGlnaGx5IGFyb3VzaW5nIGluIHNla2YgcmVwb3J0LCBzbyB3ZSB3b3VsZCBub3QgZXhwZWN0CgoKIyBsZXNzIHJlc3RydWN0IHZhcm9hYmlsaXR5CnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWggJT4lCiAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpKSU+JQogIHN1YnNldCh2YWxlbmNlYXJvdXNhbF9vdXRsaWVycyA9PSBUUlVFKSAlPiUKICAjIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICBnZ3Bsb3QoYWVzKHggPSB0aW1lcmV6ZXJvMywgeSA9IHB1cF9iYXNDb3IpKSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9IG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiwgY29sb3IgPSBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpLCBmdW4gPSBtZWFuLGdlb20gPSAibGluZSIsCiAgICAgICAgICAgICAgIHNlID0gRiwgYWxwaGEgPSAuMSwgc2l6ZSA9IDEuNSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPW1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiwgY29sb3IgPSBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpLCBzaXplID0gMykrICAKdGhlbWVfY2xhc3NpYygpKwogIHlsYWIoIlB1cGlsIHNpemUgKHopIikrCiAgeGxhYigiVGltZSAocykiKSsKICAjIHAkZ3JhcGhzdHlsZSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIHhsaW0oMCw2KSsKICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIAp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICBzdWJzZXQodmFsZW5jZWFyb3VzYWxfb3V0bGllcnMgPT0gVFJVRSkgJT4lCiAgIyBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikpJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGltZXJlemVybzMsIHkgPSBwdXBfYmFzQ29yKSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPSBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIGNvbG9yID0gbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSwgZnVuID0gbWVhbixnZW9tID0gImxpbmUiLAogICAgICAgICAgICAgICBzZSA9IEYsIGFscGhhID0gLjEsIHNpemUgPSAxLjUpKwogIHN0YXRfc21vb3RoKGFlcyhncm91cD1tZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIGNvbG9yID0gbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSwgc2l6ZSA9IDMpKyAgCnRoZW1lX2NsYXNzaWMoKSsKICB5bGFiKCJQdXBpbCBzaXplICh6KSIpKwogIHhsYWIoIlRpbWUgKHMpIikrCiAgIyBwJGdyYXBoc3R5bGUrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICB4bGltKDAsNikrCiAgIGZhY2V0X2dyaWQobWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2Uyfi4pKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApCgoKCmBgYAoKCnVuaXF1ZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHRpbWViaW4yKQojIDMwIHRpbWUgYmlucwoKYGBge3J9CiMgcHZhbDwtIGNvci50ZXN0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkc2RldmdhemVfcGFyc2VkLCB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHB1cF9iYXNDb3IpCiMgcHZhbCRlc3RpbWF0ZQoKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkc3NpZF9udW08LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHNzaWQpKQoKbGlicmFyeShwdXJycikKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXc8LXRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXclPiUKdW5ncm91cCgpJT4lCiAgbXV0YXRlKG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiA9IAogICAgICAgICAgIGlmX2Vsc2UoVmFsZW5jZU1lYW5UaGlzU2FtcGxlID49IAogICAgICAgICAgICAgICAgICAgICBtZWRpYW4oVmFsZW5jZU1lYW5UaGlzU2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAiTW9yZSBwb3NpdGl2ZSIsICJNb3JlIG5lZ2F0aXZlIikpJT4lCiAgbXV0YXRlKG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiA9IGlmX2Vsc2UoQXJvdXNhbE1lYW5UaGlzU2FtcGxlID49CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuKEFyb3VzYWxNZWFuVGhpc1NhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwgIkhpZ2giLCAiTG93IikpCgoKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckc3NpZF9zcGxpdF92YWxfdGltZTwtIHBhc3RlMCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHNzaWQsICAgICAgICAgIApwYXN0ZTAodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyRtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsCiAgICAgICBwYXN0ZTAodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lYmluMikpKQoKCnRhYmxlKGlzLm5hKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSkKdW5pcXVlKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkc3NpZF9zcGxpdF92YWxfdGltZSkKc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgsIGlzLm5hKG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSkpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHNzaWRfbnVtPC0gYXMubnVtZXJpYyh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHNzaWQpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3IDwtIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXclPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICMgc3Vic2V0KHNzaWQgPT0gMzIwKSU+JQogIHVuZ3JvdXAoKSU+JQogIGdyb3VwX2J5KHNzaWRfc3BsaXRfdmFsX3RpbWUpJT4lCiAgbXV0YXRlKGNvcl9hcm91c19wdXAgPSBjb3IudGVzdChwdXBfYmFzQ29yLCBhcm91c2FsX2MsIHVzZSA9ICJjb21wbGV0ZSIpJGVzdGltYXRlLAogICAgICAgICBjb3JfYXJvdXNfcHVwX3B2YWwgPSBjb3IudGVzdChwdXBfYmFzQ29yLCBhcm91c2FsX2MsIHVzZSA9ICJjb21wbGV0ZSIpJHAudmFsdWUpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3PC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyU+JQogIGdyb3VwX2J5KHRpbWViaW4yKSU+JQogIG11dGF0ZShtZWFuX2Nvcl9wdXAgPSBtZWFuKGNvcl9hcm91c19wdXAsIG5hLnJtID0gVFJVRSksIHNkX2Nvcl9wdXAgPSBzZChjb3JfYXJvdXNfcHVwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBtZWFuX2Nvcl9wdXBfcHZhID0gbWVhbihjb3JfYXJvdXNfcHVwX3B2YWwsIG5hLnJtID0gVFJVRSksIHNkX2Nvcl9hcm91c19wdXBfcHZhbCA9IHNkKGNvcl9hcm91c19wdXBfcHZhbCwgbmEucm0gPSBUUlVFKSkKICAKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckcHZhbF9zaWduPC0gaWZfZWxzZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JG1lYW5fY29yX3B1cF9wdmEgPCAuMDUsIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckbWVhbl9jb3JfcHVwX3B2YSwgTlVMTCkKCgoKdHRlc3RjaGVjazwtIHQudGVzdCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JGNvcl9hcm91c19wdXApCnR0ZXN0Y2hlY2skcC52YWx1ZQp0dGVzdGNoZWNrJHBhcmFtZXRlcgoKdW5pcXVlKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckc3NpZF9zcGxpdF92YWxfdGltZSkKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckdmFsZV90aW1lYmluPC0gcGFzdGUwKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLCBwYXN0ZTAodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lYmluMikpCgojIHN1YnNldCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LCB2YWxlX3RpbWViaW4gPT0gIk1vcmUgbmVnYXRpdmUoMi42LDIuODJdIikKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckc3NpZDwtIGFzLmNoYXJhY3Rlcih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHNzaWQpCgoKCgoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyAlPiUKICAgIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiwgdGltZWJpbjIpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBncm91cF9ieShtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsdGltZWJpbjIpJT4lCiAgbXV0YXRlKHB2YWwgPSB0LnRlc3QoY29yX2Fyb3VzX3B1cCkkcC52YWx1ZSwgZGYgPSB0LnRlc3QoY29yX2Fyb3VzX3B1cCkkcGFyYW1ldGVyKSU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMix0aW1lYmluMiklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXModGltZXJlemVybzMsIGNvcl9hcm91c19wdXAsIGNvbG9yID0gbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSkrCiAgIyBnZW9tX3MKICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICdsaW5lJywgc2l6ZSA9IDQpKwogICMgc3RhdF9zdW1tYXJ5KGFlcyh5ID0gcHZhbCksIGZ1biA9IG1lYW4sIGdlb20gPSAnbGluZScsIGxpbmV0eXBlID0gImRhc2hlZCIsIGFscGhhID0gLjIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC4wNSwgbGluZXR5cGUgPSAiZGFzaGVkIikrCiAgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjEsIGxpbmV0eXBlID0gImRvdHRlZCIpKwogIHRoZW1lX2NsYXNzaWMoKQoKCm5yb3cobGVmdF9qb2luKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsIGZsYWdfcG9zX25lZykpCm5yb3codG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldykKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JGNvcl9wb3NfbmVnX2RpZmZfbGFiPC0gTlVMTAp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JGNvcl9wb3NfbmVnX2RpZmY8LU5VTEwKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldzwtIGxlZnRfam9pbih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LCBmbGFnX3Bvc19uZWcpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3ICU+JQogIHN1YnNldCghaXMubmEoY29yX3Bvc19uZWdfZGlmZl9sYWIpKSU+JQogICMgc3Vic2V0KGNvcl9wb3NfbmVnX2RpZmZfbGFiID09ICJwb3MgPiBuZWciKSAlPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsIHRpbWViaW4yLGNvcl9wb3NfbmVnX2RpZmZfbGFiKSAlPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMix0aW1lYmluMikgJT4lCiAgbXV0YXRlKHB2YWwgPSB0LnRlc3QoY29yX2Fyb3VzX3B1cCkkcC52YWx1ZSwgZGYgPSB0LnRlc3QoY29yX2Fyb3VzX3B1cCkkcGFyYW1ldGVyKSU+JQogIGdyb3VwX2J5KG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMix0aW1lYmluMixjb3JfcG9zX25lZ19kaWZmX2xhYiklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSAlPiUKICAjIGdncGxvdChhZXModGltZXJlemVybzMsIGNvcl9hcm91c19wdXAsIGNvbG9yID0gbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSkrCiAgZ2dwbG90KGFlcyh0aW1lcmV6ZXJvMywgY29yX2Fyb3VzX3B1cCwgY29sb3IgPSAgY29yX3Bvc19uZWdfZGlmZl9sYWIpKSsKICAjIGdlb21fcwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gJ2xpbmUnLCBzaXplID0gNCkrCiAgIyBzdGF0X3N1bW1hcnkoYWVzKHkgPSBwdmFsKSwgZnVuID0gbWVhbiwgZ2VvbSA9ICdsaW5lJywgbGluZXR5cGUgPSAiZGFzaGVkIiwgYWxwaGEgPSAuMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjA1LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSsKICAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMSwgbGluZXR5cGUgPSAiZG90dGVkIikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSwgbGluZXR5cGUgPSAiZG90dGVkIikrCiAgIyBnZW9tX3JlY3QoeG1pbiA9IC41LCB4bWF4ID0gMSwgeW1pbiA9IC0uMiwgeW1heCA9IDEsIGFscGhhID0gLjAxLCBjb2xvciA9IEZBTFNFKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpCgoKCnJhbmdlKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckcHZhbF9zaWduLCBuYS5ybSA9IFRSVUUpCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckc3NpZF9zcGxpdF92YWxfdGltZQoKCgoKCiMgbGV0J3MgaWRlbnRpZnkgdGhlIHBlb3BsZSB3aGlvIHNob3cgdGhlIG5lZ2F0aXZlIGFyb3VzYWwgZWZmZWN0CgpgYGAKCnRpbWVjb3Vyc2UgYW5hbHlzcyB1c2luZyBsbWVyCgoxLSBzZWxlY3QgYSBiaW4KMiAtIGZpdCBhIGxtZXIKMyAtIHNhdmUgc3RhdGlzdGljcyAoZXN0aW1hdGUgYW5kIHAgdmFsdWUpCjMgLSBjcmVhdGUgY2x1c3RlcnMgKHAgdmFsdWUgPCAuMDUgaW4gYXQgbGVhc3QgMyBjb25zZWN1dGl2ZSBiaW5zKQoKYGBge3J9Cgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JAppID0gMQoKbmJpbnM8LSB1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lYmluMikKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcKCnVuaXF1ZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWViaW4yKQpsbWVyX2Jpbl9wdXA8LSBsaXN0KCkgCgojIDwtIG5yb3cobmJpbnMpCgoKbmJpbnM8LSB1bmlxdWUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lYmluMikKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JExhYmVsPC0gc3Vic3RyKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckc3RpbUlBUFMsIDEsOCkKCmltYWdlSl9JQVBTJExhYmVsCm5yb3codG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldykKIyA2MjkyMQpucm93KGxlZnRfam9pbih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LCBpbWFnZUpfSUFQUykpCgoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldzwtIGxlZnRfam9pbih0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LCBpbWFnZUpfSUFQUykKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JE1lYW5fZ3JheV96PC0gc2NhbGUodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyRNZWFuLCBzY2FsZSA9IFRSVUUsIGNlbnRlciA9IFRSVUUpWywxXQoKCnRlc3Q8LSBsbWVyKHB1cF9iYXNDb3IgfiBhcm91c2FsX2MrTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJpbjIgPT0gbmJpbnNbYl0pKQoKc3VtbWFyeSh0ZXN0KQoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0Tm8KIigwLjA0MTEsMC4yNjFdIgpzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJpbjIgPT0gbmJpbnNbMjhdICYgc3NpZCA9PSAzNDEgJiB0Tm8gPT0gMykKCnRlc3QKcm0oaSkKCmkgPSAxICMgcmVtZW1iZXIgdG8gYWx3YXlzIHJlemVybyBpdAojIGIgPSAzNApuYmluczwtIG5iaW5zWzE6MjhdCnVuaXF1ZShuYmlucykKCiMgbmJpbnM8LSBhcwoKIyBwb3NpdGl2ZQoKIyBjcmVhdGUgbnVtYmVyIHMgZm9yIHRpbWUgYmlucwp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3PC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyU+JQogIGdyb3VwX2J5KHNzaWQsIHN0aW1JQVBTKSU+JQogIG11dGF0ZSh0aW1lYmluX25vID0gMTpuKCkpCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JT4lCiAgIyBncm91cF9ieShzc2lkLCBzdGltSUFQUykKICBnZ3Bsb3QoYWVzKHRpbWViaW5fbm8pKSsKICBnZW9tX2hpc3RvZ3JhbSgpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDI4KSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAyMDApCgpgYGAKCgpgYGB7cn0KCgpucm93KG5iaW5zKQpuYmlucyA9IDMwCnRpbWVjb3Vyc2VfcmVzdWx0X2RmIDwtIGRhdGEuZnJhbWUodGltZWJpbnM9IHJlcChOQSwgMzApLCBFc3RpbWF0ZT0gcmVwKE5BLCAzMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9cmVwKE5BLCAzMCksIHA9cmVwKE5BLCAzMCksIGNvdj0gYXMuY2hhcmFjdGVyKHJlcChOQSwzMCkpKQoKVmlldyh0aW1lY291cnNlX3Jlc3VsdF9kZikKCm5iaW5zPC0gbmJpbnNbMToyOF0KCgoKaSA9IDEgIyByZW1lbWJlciB0byBhbHdheXMgcmV6ZXJvIGl0CiMgYiA9IDM0CgpuYmluczwtIHVuaXF1ZSh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWViaW5fbm8pCgp1bmlxdWUobmJpbnMpCmZvciAoYiBpbiAxOmxlbmd0aChuYmlucykpIHsKICAjIGZvciAocyBpbiAxOmxlbmd0aChuc2ltKSkgewoKICAgIG1lc3NhZ2Uoc3ByaW50ZigiJCQkJCRSVU5JTkcgbG1lciAlaSIsIG5iaW5zW2JdKSkKICAgICMgZGJfb2Y3X25ld19KRUZGRSRWaWRlb1R5cGVfY29udHJhc3Rfc2FtcGxlPC0gc2FtcGxlKChyZXAoYygtLjUsIC41KSwgZWFjaCA9ICAxOTIwKSksIHJlcGxhY2UgPSBGQUxTRSkgCiAgICAgICAgI3J1biB0aGUgbW9kZWwgb24gdGhlIGN1cnJlbnQgdGltZSBiaW4gYW5kIHNpbXVsYXRpb24gc3VtYmVyCiAgICAgICAgbG1lcl9iaW5fcHVwICA8LSBsbWVyKHB1cF9iYXNDb3IgfiBhcm91c2FsX2MrTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSA9PSAiTW9yZSBwb3NpdGl2ZSIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJpbl9ubyA9PSBuYmluc1tiXSkpCgogICAgICAgICNzdG9yZSByZXN1bHRzIGZyb20gdGhlIHNpbXVsYXRpb24KICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnk8LSBzdW1tYXJ5KGxtZXJfYmluX3B1cCkKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZbaSwxXTwtIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckdGltZXJlemVybzNbYl0gI3NhdmUgdGhlIGV4YWN0IHZhbHVlIG9mIHRpbWUgYmluCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmW2ksMl08LSBsbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDFdICMgcwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZltpLDNdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDRdICMgdCBzdGF0aXN0aWMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZbaSw0XTwtbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiw1XSAjIHAgdmFsdWUKICAgICAgICAgICAgIyBzaW11bGF0ZWRfY2x1c3RlcnNfSkVGRkVbaSw2XTwtIG5zaW1bc10gI3N0b3JlIHNpbXVsYXRpb24gb3VudAogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZltpLDVdIDwtaWZlbHNlKGxlbmd0aChsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UsICdwYXNzJykKCiAgICAgaSA9IGkrMQp9CgoKIyB0aW1lY291cnNlX3Jlc3VsdF9kZl9wb3M8LSB0aW1lY291cnNlX3Jlc3VsdF9kZgoKdGltZWNvdXJzZV9yZXN1bHRfZGYlPiUKICBnZ3Bsb3QoYWVzKHRpbWViaW5zLCB0KSkrCiAgZ2VvbV9saW5lKHNpemUgPSAyKSsKICBnZW9tX2xpbmUoYWVzKHkgPSBwKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC4wNSwgY29sb3IgPSAncmVkJywgc2l6ZSA9IDEuNSkKCgpgYGAKCgojIG5lZ2F0aXZlIGxtZXIKYGBge3J9Cgp0aW1lY291cnNlX3Jlc3VsdF9kZl9uZWcgPC0gZGF0YS5mcmFtZSh0aW1lYmlucz0gcmVwKE5BLCAzMCksIEVzdGltYXRlPSByZXAoTkEsIDMwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdD1yZXAoTkEsIDMwKSwgcD1yZXAoTkEsIDMwKSwgY292PSBhcy5jaGFyYWN0ZXIocmVwKE5BLDMwKSkpCgoKaSA9IDEKCmZvciAoYiBpbiAxOmxlbmd0aChuYmlucykpIHsKICAjIGZvciAocyBpbiAxOmxlbmd0aChuc2ltKSkgewoKICAgIG1lc3NhZ2Uoc3ByaW50ZigiJCQkJCRSVU5JTkcgbG1lciAlaSIsIG5iaW5zW2JdKSkKICAgICMgZGJfb2Y3X25ld19KRUZGRSRWaWRlb1R5cGVfY29udHJhc3Rfc2FtcGxlPC0gc2FtcGxlKChyZXAoYygtLjUsIC41KSwgZWFjaCA9ICAxOTIwKSksIHJlcGxhY2UgPSBGQUxTRSkgCiAgICAgICAgI3J1biB0aGUgbW9kZWwgb24gdGhlIGN1cnJlbnQgdGltZSBiaW4gYW5kIHNpbXVsYXRpb24gc3VtYmVyCiAgICAgICAgbG1lcl9iaW5fcHVwICA8LSBsbWVyKHB1cF9iYXNDb3IgfiBhcm91c2FsX2MrTWVhbl9ncmF5X3ogICsoMSArTWVhbl9ncmF5X3ogfCBzc2lkKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlID09ICJNb3JlIG5lZ2F0aXZlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmluX25vID09IG5iaW5zW2JdKSkKCiAgICAgICAgI3N0b3JlIHJlc3VsdHMgZnJvbSB0aGUgc2ltdWxhdGlvbgogICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeTwtIHN1bW1hcnkobG1lcl9iaW5fcHVwKQogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl9uZWdbaSwxXTwtIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckdGltZXJlemVybzNbYl0gI3NhdmUgdGhlIGV4YWN0IHZhbHVlIG9mIHRpbWUgYmluCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX25lZ1tpLDJdPC0gbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiwxXSAjIHMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfbmVnW2ksM108LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNF0gIyB0IHN0YXRpc3RpYwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl9uZWdbaSw0XTwtbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiw1XSAjIHAgdmFsdWUKICAgICAgICAgICAgIyBzaW11bGF0ZWRfY2x1c3RlcnNfSkVGRkVbaSw2XTwtIG5zaW1bc10gI3N0b3JlIHNpbXVsYXRpb24gb3VudAogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl9uZWdbaSw1XSA8LWlmZWxzZShsZW5ndGgobG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlLCAncGFzcycpCgogICAgIGkgPSBpKzEKfQoKClZpZXcodGltZWNvdXJzZV9yZXN1bHRfZGZfbmVnKQoKIyB3aGV0aGVyIEkgdXNlIGdyb3VuZCB2YWxlbmNlLCBzZWxmIHZhbGVtY2Ugb3IgdGhpcyBzYW1wbGUgYXZlcmFnZSB2YWxlbmNlLCBJIGdldCB0aGUgc2FtZSBwYXR0ZXJucwoKdGltZWNvdXJzZV9yZXN1bHRfZGZfbmVnJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMSwgY29sb3IgPSAncmVkJywgc2l6ZSA9IDEuNSkKCmBgYAoKCgpgYGB7cn0KdGltZWNvdXJzZV9yZXN1bHRfZGYkVmFsZW5jZSA8LSAiTW9yZSBuZWdhdGl2ZSIKCnRpbWVjb3Vyc2VfcmVzdWx0X2RmX25lZyRWYWxlbmNlPC0gIk1vcmUgcG9zaXRpdmUiCgpiaW5kX3Jvd3ModGltZWNvdXJzZV9yZXN1bHRfZGYsdGltZWNvdXJzZV9yZXN1bHRfZGZfbmVnKSU+JQogICAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCwgY29sb3IgPSBWYWxlbmNlKSkrCiAgZ2VvbV9saW5lKHNpemUgPSAyKSsKICBnZW9tX2xpbmUoYWVzKHkgPSBwKSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC4wNSwgY29sb3IgPSAncmVkJywgc2l6ZSA9IDEuNSkKCgpgYGAKIyB1c2UgdmFsZW5jZSB0byBwdXBpbApgYGB7cn0KdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsIDwtIGRhdGEuZnJhbWUodGltZWJpbnM9IHJlcChOQSwgMzApLCBFc3RpbWF0ZT0gcmVwKE5BLCAzMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9cmVwKE5BLCAzMCksIHA9cmVwKE5BLCAzMCksIGNvdj0gYXMuY2hhcmFjdGVyKHJlcChOQSwzMCkpKQoKCmkgPSAxCgpmb3IgKGIgaW4gMTpsZW5ndGgobmJpbnMpKSB7CiAgIyBmb3IgKHMgaW4gMTpsZW5ndGgobnNpbSkpIHsKCiAgICBtZXNzYWdlKHNwcmludGYoIiQkJCQkUlVOSU5HIGxtZXIgJWkiLCBuYmluc1tiXSkpCiAgICAjIGRiX29mN19uZXdfSkVGRkUkVmlkZW9UeXBlX2NvbnRyYXN0X3NhbXBsZTwtIHNhbXBsZSgocmVwKGMoLS41LCAuNSksIGVhY2ggPSAgMTkyMCkpLCByZXBsYWNlID0gRkFMU0UpIAogICAgICAgICNydW4gdGhlIG1vZGVsIG9uIHRoZSBjdXJyZW50IHRpbWUgYmluIGFuZCBzaW11bGF0aW9uIHN1bWJlcgogICAgICAgIGxtZXJfYmluX3B1cCAgPC0gbG1lcihwdXBfYmFzQ29yIH4gYXJvdXNhbF9jKyB2YWxlbmNlX2MrIE1lYW5fZ3JheV96ICArKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UgPT0gIk1vcmUgbmVnYXRpdmUiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWViaW5fbm8gPT0gbmJpbnNbYl0pKQoKICAgICAgICAjc3RvcmUgcmVzdWx0cyBmcm9tIHRoZSBzaW11bGF0aW9uCiAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5PC0gc3VtbWFyeShsbWVyX2Jpbl9wdXApCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbFtpLDFdPC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lcmV6ZXJvM1tiXSAjc2F2ZSB0aGUgZXhhY3QgdmFsdWUgb2YgdGltZSBiaW4KICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsW2ksMl08LSBsbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDFdICMgcwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxbaSwzXTwtbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiw0XSAjIHQgc3RhdGlzdGljCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbFtpLDRdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDVdICMgcCB2YWx1ZQogICAgICAgICAgICAjIHNpbXVsYXRlZF9jbHVzdGVyc19KRUZGRVtpLDZdPC0gbnNpbVtzXSAjc3RvcmUgc2ltdWxhdGlvbiBvdW50CiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbFtpLDVdIDwtaWZlbHNlKGxlbmd0aChsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UsICdwYXNzJykKCiAgICAgaSA9IGkrMQp9CgojIHZhbGVuY2UgdG8gcHVwaWwKdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMDUsIGNvbG9yID0gJ3JlZCcsIHNpemUgPSAxLjUpCgpgYGAKCgojIHVzZSB2YWxlbmNlIHRvIHB1cGlsCgpgYGB7cn0KdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hciA8LSBkYXRhLmZyYW1lKHRpbWViaW5zPSByZXAoTkEsIDMwKSwgRXN0aW1hdGU9IHJlcChOQSwgMzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PXJlcChOQSwgMzApLCBwPXJlcChOQSwgMzApLCBjb3Y9IGFzLmNoYXJhY3RlcihyZXAoTkEsMzApKSkKCgppID0gMQoKZm9yIChiIGluIDE6bGVuZ3RoKG5iaW5zKSkgewogICMgZm9yIChzIGluIDE6bGVuZ3RoKG5zaW0pKSB7CgogICAgbWVzc2FnZShzcHJpbnRmKCIkJCQkJFJVTklORyBsbWVyICVpIiwgbmJpbnNbYl0pKQogICAgIyBkYl9vZjdfbmV3X0pFRkZFJFZpZGVvVHlwZV9jb250cmFzdF9zYW1wbGU8LSBzYW1wbGUoKHJlcChjKC0uNSwgLjUpLCBlYWNoID0gIDE5MjApKSwgcmVwbGFjZSA9IEZBTFNFKSAKICAgICAgICAjcnVuIHRoZSBtb2RlbCBvbiB0aGUgY3VycmVudCB0aW1lIGJpbiBhbmQgc2ltdWxhdGlvbiBzdW1iZXIKICAgICAgICBsbWVyX2Jpbl9wdXAgIDwtIGxtZXIocHVwX2Jhc0NvciB+IHZhbGVuY2VfYysgYXJvdXNhbCtNZWFuX2dyYXlfeiAgKygxICsgTWVhbl9ncmF5X3ogfCBzc2lkKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlID09ICJNb3JlIG5lZ2F0aXZlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmluX25vID09IG5iaW5zW2JdKSkKCiAgICAgICAgI3N0b3JlIHJlc3VsdHMgZnJvbSB0aGUgc2ltdWxhdGlvbgogICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeTwtIHN1bW1hcnkobG1lcl9iaW5fcHVwKQogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyW2ksMV08LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWVyZXplcm8zW2JdICNzYXZlIHRoZSBleGFjdCB2YWx1ZSBvZiB0aW1lIGJpbgogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyW2ksMl08LSBsbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDFdICMgcwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyW2ksM108LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNF0gIyB0IHN0YXRpc3RpYwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyW2ksNF08LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNV0gIyBwIHZhbHVlCiAgICAgICAgICAgICMgc2ltdWxhdGVkX2NsdXN0ZXJzX0pFRkZFW2ksNl08LSBuc2ltW3NdICNzdG9yZSBzaW11bGF0aW9uIG91bnQKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hcltpLDVdIDwtaWZlbHNlKGxlbmd0aChsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UsICdwYXNzJykKCiAgICAgaSA9IGkrMQp9CgoKdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hciU+JQogIGdncGxvdChhZXModGltZWJpbnMsIHQpKSsKICBnZW9tX2xpbmUoc2l6ZSA9IDIpKwogIGdlb21fbGluZShhZXMoeSA9IHApLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjA1LCBjb2xvciA9ICdyZWQnLCBzaXplID0gMS41KQoKCgpgYGAKCnZhbGVuY2UgZm9yIGhpZ2ggdnMgbG93CmBgYHtyfQp0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX25lZyA8LSBkYXRhLmZyYW1lKHRpbWViaW5zPSByZXAoTkEsIDMwKSwgRXN0aW1hdGU9IHJlcChOQSwgMzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PXJlcChOQSwgMzApLCBwPXJlcChOQSwgMzApLCBjb3Y9IGFzLmNoYXJhY3RlcihyZXAoTkEsMzApKSkKCgppID0gMQoKZm9yIChiIGluIDE6bGVuZ3RoKG5iaW5zKSkgewogICMgZm9yIChzIGluIDE6bGVuZ3RoKG5zaW0pKSB7CgogICAgbWVzc2FnZShzcHJpbnRmKCIkJCQkJFJVTklORyBsbWVyICVpIiwgbmJpbnNbYl0pKQogICAgIyBkYl9vZjdfbmV3X0pFRkZFJFZpZGVvVHlwZV9jb250cmFzdF9zYW1wbGU8LSBzYW1wbGUoKHJlcChjKC0uNSwgLjUpLCBlYWNoID0gIDE5MjApKSwgcmVwbGFjZSA9IEZBTFNFKSAKICAgICAgICAjcnVuIHRoZSBtb2RlbCBvbiB0aGUgY3VycmVudCB0aW1lIGJpbiBhbmQgc2ltdWxhdGlvbiBzdW1iZXIKICAgICAgICBsbWVyX2Jpbl9wdXAgIDwtIGxtZXIocHVwX2Jhc0NvciB+IHZhbGVuY2VfYyArIE1lYW5fZ3JheV96ICArKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyID09ICJIaWdoIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWViaW5fbm8gPT0gbmJpbnNbYl0pKQoKICAgICAgICAjc3RvcmUgcmVzdWx0cyBmcm9tIHRoZSBzaW11bGF0aW9uCiAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5PC0gc3VtbWFyeShsbWVyX2Jpbl9wdXApCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbF9hbmRfYXJfbmVnW2ksMV08LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWVyZXplcm8zW2JdICNzYXZlIHRoZSBleGFjdCB2YWx1ZSBvZiB0aW1lIGJpbgogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX25lZ1tpLDJdPC0gbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiwxXSAjIHMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hcl9uZWdbaSwzXTwtbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiw0XSAjIHQgc3RhdGlzdGljCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbF9hbmRfYXJfbmVnW2ksNF08LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNV0gIyBwIHZhbHVlCiAgICAgICAgICAgICMgc2ltdWxhdGVkX2NsdXN0ZXJzX0pFRkZFW2ksNl08LSBuc2ltW3NdICNzdG9yZSBzaW11bGF0aW9uIG91bnQKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hcl9uZWdbaSw1XSA8LWlmZWxzZShsZW5ndGgobG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlLCAncGFzcycpCgogICAgIGkgPSBpKzEKfQoKVmlldyh0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX25lZykKCnRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbF9hbmRfYXJfbmVnJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMDUsIGNvbG9yID0gJ3JlZCcsIHNpemUgPSAxLjUpKwogIGdndGl0bGUoInB1cGlsIH4gdmFsZW5jZSBmb3IgaGlnaCBhcm91c2FsIikKCmBgYAoKIyAKCmBgYHtyfQp0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX2xvdyA8LSBkYXRhLmZyYW1lKHRpbWViaW5zPSByZXAoTkEsIDMwKSwgRXN0aW1hdGU9IHJlcChOQSwgMzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PXJlcChOQSwgMzApLCBwPXJlcChOQSwgMzApLCBjb3Y9IGFzLmNoYXJhY3RlcihyZXAoTkEsMzApKSkKCgppID0gMQoKZm9yIChiIGluIDE6bGVuZ3RoKG5iaW5zKSkgewogICMgZm9yIChzIGluIDE6bGVuZ3RoKG5zaW0pKSB7CgogICAgbWVzc2FnZShzcHJpbnRmKCIkJCQkJFJVTklORyBsbWVyICVpIiwgbmJpbnNbYl0pKQogICAgIyBkYl9vZjdfbmV3X0pFRkZFJFZpZGVvVHlwZV9jb250cmFzdF9zYW1wbGU8LSBzYW1wbGUoKHJlcChjKC0uNSwgLjUpLCBlYWNoID0gIDE5MjApKSwgcmVwbGFjZSA9IEZBTFNFKSAKICAgICAgICAjcnVuIHRoZSBtb2RlbCBvbiB0aGUgY3VycmVudCB0aW1lIGJpbiBhbmQgc2ltdWxhdGlvbiBzdW1iZXIKICAgICAgICBsbWVyX2Jpbl9wdXAgIDwtIGxtZXIocHVwX2Jhc0NvciB+IHZhbGVuY2VfYyArTWVhbl9ncmF5X3ogICsoMSArIE1lYW5fZ3JheV96IHwgc3NpZCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxfHN0aW1JQVBTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIgPT0gIkxvdyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmluX25vID09IG5iaW5zW2JdKSkKCiAgICAgICAgI3N0b3JlIHJlc3VsdHMgZnJvbSB0aGUgc2ltdWxhdGlvbgogICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeTwtIHN1bW1hcnkobG1lcl9iaW5fcHVwKQogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX2xvd1tpLDFdPC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lcmV6ZXJvM1tiXSAjc2F2ZSB0aGUgZXhhY3QgdmFsdWUgb2YgdGltZSBiaW4KICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hcl9sb3dbaSwyXTwtIGxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsMV0gIyBzCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbF9hbmRfYXJfbG93W2ksM108LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNF0gIyB0IHN0YXRpc3RpYwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX2xvd1tpLDRdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDVdICMgcCB2YWx1ZQogICAgICAgICAgICAjIHNpbXVsYXRlZF9jbHVzdGVyc19KRUZGRVtpLDZdPC0gbnNpbVtzXSAjc3RvcmUgc2ltdWxhdGlvbiBvdW50CiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZhbF9hbmRfYXJfbG93W2ksNV0gPC1pZmVsc2UobGVuZ3RoKGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSwgJ3Bhc3MnKQoKICAgICBpID0gaSsxCn0KClZpZXcodGltZWNvdXJzZV9yZXN1bHRfZGZfdmFsX2FuZF9hcl9uZWcpCgp0aW1lY291cnNlX3Jlc3VsdF9kZl92YWxfYW5kX2FyX2xvdyU+JQogIGdncGxvdChhZXModGltZWJpbnMsIHQpKSsKICBnZW9tX2xpbmUoc2l6ZSA9IDIpKwogIGdlb21fbGluZShhZXMoeSA9IHApLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjA1LCBjb2xvciA9ICdyZWQnLCBzaXplID0gMS41KQoKCmBgYAoKCgoKdmVsb2NpdHkgYW5hbHlzZXMKYGBge3J9CiMgdGhvdWdodCBtYXliZSBpdCBoYXMgc29lbXRoaW5nIHRvIHRvIHdpdGggdGhlIHZlbGNpdHksIHZlbG9jaXR5IGlzIHNpZGRlcmVudAoKaW5zdGFsbC5wYWNrYWdlcygicHNwbGluZSIpCmxpYnJhcnkocHNwbGluZSkKCnByZWRpY3Qoc20uc3BsaW5lKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkdGltZXJlemVybzMsIAogICAgICAgICAgICAgICAgICB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHB1cF9iYXNDb3IpLCAKICAgICAgICB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHRpbWVyZXplcm8zLCAxKQoKRCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoJHB1cF9iYXNDb3IsICd4JykKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcgPC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyAlPiUKICAjIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICAjIHN1YnNldCh2YWxlbmNlYXJvdXNhbF9vdXRsaWVycyA9PSBUUlVFKSAlPiUKICAjIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICBncm91cF9ieShzc2lkLCBzdGltSUFQUykgJT4lCiAgbXV0YXRlKHB1cF92ZWxvY2l0eSA9IChhYnMobGFnKHB1cF9iYXNDb3IpLXB1cF9iYXNDb3IpL2FicyhsYWcodGltZXJlemVybzMpLXRpbWVyZXplcm8zKSkpCiAgIyBtdXRhdGUocHVwX3ZlbG9jaXR5X3BlYWsgPSBtYXgocHVwX3ZlbG9jaXR5LCBuYS5ybSA9IFRSVUUpKQoKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXckcHVwX3ZlbG9jaXR5CgojIGdsb2JhbAp0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWwgPC0gZGF0YS5mcmFtZSh0aW1lYmlucz0gcmVwKE5BLCAzMCksIEVzdGltYXRlPSByZXAoTkEsIDMwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdD1yZXAoTkEsIDMwKSwgcD1yZXAoTkEsIDMwKSwgY292PSBhcy5jaGFyYWN0ZXIocmVwKE5BLDMwKSkpCgoKaSA9IDEKYgoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyRwdXBfdmVsb2NpdHkKCmxtZXJfYmluX3B1cCAgPC0gbG1lcihwdXBfdmVsb2NpdHkgfiBhcm91c2FsX2MgKyBNZWFuX2dyYXlfeiAgKyAoMSArIE1lYW5fZ3JheV96IHwgc3NpZCksCiAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWViaW5fbm8gPT0gbmJpbnNbMl0pKQoKZm9yIChiIGluIDI6bGVuZ3RoKG5iaW5zKSkgewogICMgZm9yIChzIGluIDE6bGVuZ3RoKG5zaW0pKSB7CgogICAgbWVzc2FnZShzcHJpbnRmKCIkJCQkJFJVTklORyBsbWVyICVpIiwgbmJpbnNbYl0pKQogICAgIyBkYl9vZjdfbmV3X0pFRkZFJFZpZGVvVHlwZV9jb250cmFzdF9zYW1wbGU8LSBzYW1wbGUoKHJlcChjKC0uNSwgLjUpLCBlYWNoID0gIDE5MjApKSwgcmVwbGFjZSA9IEZBTFNFKSAKICAgICAgICAjcnVuIHRoZSBtb2RlbCBvbiB0aGUgY3VycmVudCB0aW1lIGJpbiBhbmQgc2ltdWxhdGlvbiBzdW1iZXIKICAgICAgICBsbWVyX2Jpbl9wdXAgIDwtIGxtZXIocHVwX3ZlbG9jaXR5IH4gYXJvdXNhbF9jICsgTWVhbl9ncmF5X3ogICsgKDEgKyBNZWFuX2dyYXlfeiB8IHNzaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIWlzLm5hPT0gIk1vcmUgbmVnYXRpdmUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJpbl9ubyA9PSBuYmluc1tiXSkpCgogICAgICAgICNzdG9yZSByZXN1bHRzIGZyb20gdGhlIHNpbXVsYXRpb24KICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnk8LSBzdW1tYXJ5KGxtZXJfYmluX3B1cCkKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsW2ksMV08LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWVyZXplcm8zW2JdICNzYXZlIHRoZSBleGFjdCB2YWx1ZSBvZiB0aW1lIGJpbgogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxbaSwyXTwtIGxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsMV0gIyBzCiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZlbFtpLDNdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDRdICMgdCBzdGF0aXN0aWMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsW2ksNF08LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNV0gIyBwIHZhbHVlCiAgICAgICAgICAgICMgc2ltdWxhdGVkX2NsdXN0ZXJzX0pFRkZFW2ksNl08LSBuc2ltW3NdICNzdG9yZSBzaW11bGF0aW9uIG91bnQKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsW2ksNV0gPC1pZmVsc2UobGVuZ3RoKGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSwgJ3Bhc3MnKQoKICAgICBpID0gaSsxCn0KCgpWaWV3KHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZlbCkKCgoKIyB3aGV0aGVyIEkgdXNlIGdyb3VuZCB2YWxlbmNlLCBzZWxmIHZhbGVtY2Ugb3IgdGhpcyBzYW1wbGUgYXZlcmFnZSB2YWxlbmNlLCBJIGdldCB0aGUgc2FtZSBwYXR0ZXJucwoKdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMDUsIGNvbG9yID0gJ3JlZCcsIHNpemUgPSAxLjUpCgoKIyBhcm91c2FsIHJhdGluZyBpcyByZWxhdGVkIHRvIHZlbG9jaXR5IGFyb3VuZCB0aGUgcmVjb3ZlcnkgdGltZSAxOjJpcywgYW5kIGxhdGVyIGFyb3VuZCA0CgoKYGBgCgoKVmVsb2NpdHkgYnkgdmFsZW5jZQpgYGB7cn0KCgp0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zIDwtIGRhdGEuZnJhbWUodGltZWJpbnM9IHJlcChOQSwgMzApLCBFc3RpbWF0ZT0gcmVwKE5BLCAzMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9cmVwKE5BLCAzMCksIHA9cmVwKE5BLCAzMCksIGNvdj0gYXMuY2hhcmFjdGVyKHJlcChOQSwzMCkpKQoKCmkgPSAxCiMgYgoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyRwdXBfdmVsb2NpdHkKCgpmb3IgKGIgaW4gMjpsZW5ndGgobmJpbnMpKSB7CiAgIyBmb3IgKHMgaW4gMTpsZW5ndGgobnNpbSkpIHsKCiAgICBtZXNzYWdlKHNwcmludGYoIiQkJCQkUlVOSU5HIGxtZXIgJWkiLCBuYmluc1tiXSkpCiAgICAjIGRiX29mN19uZXdfSkVGRkUkVmlkZW9UeXBlX2NvbnRyYXN0X3NhbXBsZTwtIHNhbXBsZSgocmVwKGMoLS41LCAuNSksIGVhY2ggPSAgMTkyMCkpLCByZXBsYWNlID0gRkFMU0UpIAogICAgICAgICNydW4gdGhlIG1vZGVsIG9uIHRoZSBjdXJyZW50IHRpbWUgYmluIGFuZCBzaW11bGF0aW9uIHN1bWJlcgogICAgICAgIGxtZXJfYmluX3B1cCAgPC0gbG1lcihwdXBfdmVsb2NpdHkgfiBhcm91c2FsX2MgKyBNZWFuX2dyYXlfeiAgKyAoMSAgfCBzc2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfHN0aW1JQVBTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldCh0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTI9PSAiTW9yZSBwb3NpdGl2ZSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lYmluX25vID09IG5iaW5zW2JdKSkKCiAgICAgICAgI3N0b3JlIHJlc3VsdHMgZnJvbSB0aGUgc2ltdWxhdGlvbgogICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeTwtIHN1bW1hcnkobG1lcl9iaW5fcHVwKQogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zW2ksMV08LSB0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHRpbWVyZXplcm8zW2JdICNzYXZlIHRoZSBleGFjdCB2YWx1ZSBvZiB0aW1lIGJpbgogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zW2ksMl08LSBsbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDFdICMgcwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zW2ksM108LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNF0gIyB0IHN0YXRpc3RpYwogICAgICAgICAgICB0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zW2ksNF08LWxtZXJfYmluX3B1cF9zdW1tYXJ5W1siY29lZmZpY2llbnRzIl1dWzIsNV0gIyBwIHZhbHVlCiAgICAgICAgICAgICMgc2ltdWxhdGVkX2NsdXN0ZXJzX0pFRkZFW2ksNl08LSBuc2ltW3NdICNzdG9yZSBzaW11bGF0aW9uIG91bnQKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX3Bvc1tpLDVdIDwtaWZlbHNlKGxlbmd0aChsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxtZXJfYmluX3B1cF9zdW1tYXJ5JG9wdGluZm8kY29udiRsbWU0JG1lc3NhZ2UsICdwYXNzJykKCiAgICAgaSA9IGkrMQp9CgojIDExIHNpbmd1bGFyaXR5IGNhc2VzCgpWaWV3KHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZlbF9wb3MpCgoKCgojIHdoZXRoZXIgSSB1c2UgZ3JvdW5kIHZhbGVuY2UsIHNlbGYgdmFsZW1jZSBvciB0aGlzIHNhbXBsZSBhdmVyYWdlIHZhbGVuY2UsIEkgZ2V0IHRoZSBzYW1lIHBhdHRlcm5zCgp0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfcG9zJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMDUsIGNvbG9yID0gJ3JlZCcsIHNpemUgPSAxLjUpCgoKIyBhcm91c2FsIHJhdGluZyBpcyByZWxhdGVkIHRvIHZlbG9jaXR5IGFyb3VuZCB0aGUgcmVjb3ZlcnkgdGltZSAxIHRvIDEuNgoKCgpgYGAKCgoKTmVnYXRpdmUgdmVsb2NpdHkKCmBgYHtyfQoKdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZyA8LSBkYXRhLmZyYW1lKHRpbWViaW5zPSByZXAoTkEsIDMwKSwgRXN0aW1hdGU9IHJlcChOQSwgMzApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PXJlcChOQSwgMzApLCBwPXJlcChOQSwgMzApLCBjb3Y9IGFzLmNoYXJhY3RlcihyZXAoTkEsMzApKSkKCgppID0gMQpiCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVobmV3JHB1cF92ZWxvY2l0eQoKCmZvciAoYiBpbiAyOmxlbmd0aChuYmlucykpIHsKICAjIGZvciAocyBpbiAxOmxlbmd0aChuc2ltKSkgewoKICAgIG1lc3NhZ2Uoc3ByaW50ZigiJCQkJCRSVU5JTkcgbG1lciAlaSIsIG5iaW5zW2JdKSkKICAgICMgZGJfb2Y3X25ld19KRUZGRSRWaWRlb1R5cGVfY29udHJhc3Rfc2FtcGxlPC0gc2FtcGxlKChyZXAoYygtLjUsIC41KSwgZWFjaCA9ICAxOTIwKSksIHJlcGxhY2UgPSBGQUxTRSkgCiAgICAgICAgI3J1biB0aGUgbW9kZWwgb24gdGhlIGN1cnJlbnQgdGltZSBiaW4gYW5kIHNpbXVsYXRpb24gc3VtYmVyCiAgICAgICAgbG1lcl9iaW5fcHVwICA8LSBsbWVyKHB1cF92ZWxvY2l0eSB+IGFyb3VzYWxfYyArIE1lYW5fZ3JheV96ICArICgxIHwgc3NpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdWJzZXQodG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyPT0gIk1vcmUgbmVnYXRpdmUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWJpbl9ubyA9PSBuYmluc1tiXSkpCgogICAgICAgICNzdG9yZSByZXN1bHRzIGZyb20gdGhlIHNpbXVsYXRpb24KICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnk8LSBzdW1tYXJ5KGxtZXJfYmluX3B1cCkKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZ1tpLDFdPC0gdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaG5ldyR0aW1lcmV6ZXJvM1tiXSAjc2F2ZSB0aGUgZXhhY3QgdmFsdWUgb2YgdGltZSBiaW4KICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZ1tpLDJdPC0gbG1lcl9iaW5fcHVwX3N1bW1hcnlbWyJjb2VmZmljaWVudHMiXV1bMiwxXSAjIHMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZ1tpLDNdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDRdICMgdCBzdGF0aXN0aWMKICAgICAgICAgICAgdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZ1tpLDRdPC1sbWVyX2Jpbl9wdXBfc3VtbWFyeVtbImNvZWZmaWNpZW50cyJdXVsyLDVdICMgcCB2YWx1ZQogICAgICAgICAgICAjIHNpbXVsYXRlZF9jbHVzdGVyc19KRUZGRVtpLDZdPC0gbnNpbVtzXSAjc3RvcmUgc2ltdWxhdGlvbiBvdW50CiAgICAgICAgICAgIHRpbWVjb3Vyc2VfcmVzdWx0X2RmX3ZlbF9uZWdbaSw1XSA8LWlmZWxzZShsZW5ndGgobG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbWVyX2Jpbl9wdXBfc3VtbWFyeSRvcHRpbmZvJGNvbnYkbG1lNCRtZXNzYWdlLCAncGFzcycpCgogICAgIGkgPSBpKzEKfQoKIyAxMSBzaW5ndWxhcml0eSBjYXNlcwoKVmlldyh0aW1lY291cnNlX3Jlc3VsdF9kZl92ZWxfbmVnKQoKCgoKIyB3aGV0aGVyIEkgdXNlIGdyb3VuZCB2YWxlbmNlLCBzZWxmIHZhbGVtY2Ugb3IgdGhpcyBzYW1wbGUgYXZlcmFnZSB2YWxlbmNlLCBJIGdldCB0aGUgc2FtZSBwYXR0ZXJucwoKdGltZWNvdXJzZV9yZXN1bHRfZGZfdmVsX25lZyU+JQogIGdncGxvdChhZXModGltZWJpbnMsIHQpKSsKICBnZW9tX2xpbmUoc2l6ZSA9IDIpKwogIGdlb21fbGluZShhZXMoeSA9IHApLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLjA1LCBjb2xvciA9ICdyZWQnLCBzaXplID0gMS41KQoKCiMgYXJvdXNhbCByYXRpbmcgaXMgcmVsYXRlZCB0byB2ZWxvY2l0eSBhcm91bmQgdGhlIHJlY292ZXJ5IHRpbWUgMSB0byAxLjYKCgpgYGAKCkEgZmV3IHBsb3RzIGZvciB2ZWxvY2l0eQpgYGB7cn0KICBnZ3Bsb3QoYWVzKHggPSB0aW1lcmV6ZXJvMywgeSA9IHB1cF92ZWxvY2l0eSkpKwogIHN0YXRfc21vb3RoKGFlcyhncm91cD0gbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLCBjb2xvciA9IG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiksIGZ1biA9IG1lYW4sZ2VvbSA9ICJsaW5lIiwKICAgICAgICAgICAgICAgc2UgPSBGLCBhbHBoYSA9IC4xLCBzaXplID0gMS41KSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLCBjb2xvciA9IG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiksIHNpemUgPSAzKSsgIAp0aGVtZV9jbGFzc2ljKCkrCiAgeWxhYigiUHVwaWwgdmVsb2NpdHkiKSsKICB4bGFiKCJUaW1lIChzKSIpKwogICMgcCRncmFwaHN0eWxlKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCiAgeGxpbSgwLDYpKwogICAjIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMikrCiAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMSkKCgoKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCR0aW1lcmV6ZXJvMwp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICBzdWJzZXQodGltZXJlemVybzM+MSApICU+JQogICMgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpKSU+JQogIGdyb3VwX2J5KHNzaWQsIHN0aW1JQVBTKSU+JQogIG11dGF0ZShwdXBfdmVsb2NpdHkgPSAoYWJzKGxhZyhwdXBfYmFzQ29yKS1wdXBfYmFzQ29yKSkvKGFicyhsYWcodGltZXJlemVybzMpLXRpbWVyZXplcm8zKSkpJT4lCiAgbXV0YXRlKHB1cF92ZWxvY2l0eV9wZWFrID0gbWF4KHB1cF92ZWxvY2l0eSwgbmEucm0gPSBUUlVFKSklPiUKICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMixtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKHggPSBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIsIHkgPSBwdXBfdmVsb2NpdHkpKSsKICAjIGdlb21faml0dGVyKHdpZHRoID0gLjEsIGFscGhhID0gLjEpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICB0aGVtZV9jbGFzc2ljKCkrCiAgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoKSsKICB5bGFiKCJQdXBpbCB2ZWxvY2l0eSAoeikiKSsKICB4bGFiKCJUaW1lIChzKSIpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikKCgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSklPiUKICBzdWJzZXQodGltZXJlemVybzM+MSkgJT4lCiAgIyBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMikpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgc3RpbUlBUFMpJT4lCiAgbXV0YXRlKHB1cF92ZWxvY2l0eSA9IChhYnMobGFnKHB1cF9iYXNDb3IpLXB1cF9iYXNDb3IpKS8oYWJzKGxhZyh0aW1lcmV6ZXJvMyktdGltZXJlemVybzMpKSklPiUKICBtdXRhdGUocHVwX3ZlbG9jaXR5X3BlYWsgPSBtYXgocHVwX3ZlbG9jaXR5LCBuYS5ybSA9IFRSVUUpKSU+JQogIGdyb3VwX2J5KHNzaWQsbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyLG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoeCA9IG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMiwgeSA9IHB1cF92ZWxvY2l0eV9wZWFrKSkrCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpKwogIHRoZW1lX2NsYXNzaWMoKSsKICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpKwogIHlsYWIoInBlYWsgUHVwaWwgdmVsb2NpdHkgKHopIikrCiAgeGxhYigiVGltZSAocykiKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpCiAgCiAgCgpgYGAKYGBge3J9CnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWhuZXclPiUKICAgIGdyb3VwX2J5KG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSwgdGltZWJpbjIpJT4lCnN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyh0aW1lcmV6ZXJvMywgY29yX2Fyb3VzX3B1cCwgY29sb3IgPSBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpKSsKICAjIGdlb21fcwogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICBzdGF0X3N1bW1hcnkoYWVzKHkgPSBjb3JfYXJvdXNfcHVwX3B2YWwpLCBmdW4gPSBtZWFuLCBnZW9tID0gJ2xpbmUnLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMSwgbGluZXR5cGUgPSAiZGFzaGVkIikKICBnZW9tX3JlY3QoYWVzKHhtaW4gPSB0aW1lcmV6ZXJvMywgeG1heCA9IGRwbHlyOjpsZWFkKHRpbWVyZXplcm8zKSwgeW1pbiA9LjYzICwgeW1heCA9LjY2ICwgZmlsbCA9IHB2YWxfc2lnbiksIAogICAgICAgICAgICBhbHBoYSA9IDAuOCkKICAKICAKICAKICAjIHN0YXRfc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLCBzZSA9IEYsIGFscGhhID0gLjEpCiAgIyBtdXRhdGUoCiAgIyAgIG1vZGVsID0gbWFwKGRhdGEsIH5sbShwdXBfYmFzQ29yIH4gYXJvdXNhbF9jLCBkYXRhID0gLikpLAogICMgICBjb3IgPSBtYXAoZGF0YSwgcG9zc2libHkoCiAgIyAgICAgfnRpZHkoY29yLnRlc3QoLngkcHVwX2Jhc0NvciwgLngkYXJvdXNhbF9jKSwgMyksIG90aGVyd2lzZSA9IGRhdGEuZnJhbWUoKSkKICAjICAgKQogICMgKQoKCgpgYGAKCgojIHNlbGYgYXJvdXNhbAoKYGBge3J9Cgp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEoZ3JvdW5kX2Fyb3VzYWxfbGFiKSklPiUKICBnZ3Bsb3QoYWVzKHggPSB0aW1lcmV6ZXJvMywgeSA9IHB1cF9iYXNDb3IpKSsKICBzdGF0X3Ntb290aChhZXMoZ3JvdXA9IGdyb3VuZF9hcm91c2FsX2xhYiwgY29sb3IgPSBncm91bmRfYXJvdXNhbF9sYWIpLCBmdW4gPSBtZWFuLGdlb20gPSAibGluZSIsCiAgICAgICAgICAgICAgIHNlID0gRiwgYWxwaGEgPSAuMSwgc2l6ZSA9IDEuNSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPWdyb3VuZF9hcm91c2FsX2xhYiwgY29sb3IgPSBncm91bmRfYXJvdXNhbF9sYWIpLCBzaXplID0gMykrICAKdGhlbWVfY2xhc3NpYygpKwogIHlsYWIoIlB1cGlsIHNpemUgKHopIikrCiAgeGxhYigiVGltZSAocykiKSsKICAjIHAkZ3JhcGhzdHlsZSsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpKwogIHhsaW0oMCw2KSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpCgoKCmBgYAoKCmBgYHtyfQoKIyBwbG90IHdpdGggdmFsZW5jZQp0bXAuZGY0X2Z1bGxfc3RpbV9kb3duc19qdW4yMDIxX3dpdGhfYmVoICU+JQogIHN1YnNldCghaXMubmEoZ3JvdW5kX2Fyb3VzYWxfbGFiKSklPiUKICBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgdGltZWJpbjIpJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGltZXJlemVybzMsIHkgPSBwdXBfYmFzQ29yKSkrCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgY29sb3IgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSksIGZ1biA9IG1lYW4sZ2VvbSA9ICJsaW5lIiwKICAgICAgICAgICAgICAgc2UgPSBGLCBzaXplID0gMS41KSsKICAjIHN0YXRfc21vb3RoKGFlcyhncm91cD1ncm91bmRfdmFsZW5jZV9sYWIsIGNvbG9yID0gZ3JvdW5kX3ZhbGVuY2VfbGFiKSwgc2l6ZSA9IDMpKyAgCnRoZW1lX2NsYXNzaWMoKSsKICB5bGFiKCJQdXBpbCBzaXplICh6KSIpKwogIHhsYWIoIlRpbWUgKHMpIikrCiAgIyBwJGdyYXBoc3R5bGUrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICB4bGltKDAsNikKCgoKdGVzdDwtIGNvci50ZXN0KGRiXzIwMjFfcHVwaWxfc3VtbSRocl9pbnRlcnAsZGJfMjAyMV9wdXBpbF9zdW1tJHB1cF9iYXNDb3IpCgp0ZXN0JHAudmFsdWUKdG1wLmRmNF9mdWxsX3N0aW1fZG93bnNfanVuMjAyMV93aXRoX2JlaCRzc2lkX2dyb3VuZF92YWxlbmNlPC0gcGFzdGUwKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkc3NpZCwgcGFzdGUwKHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWgkZ3JvdW5kX2Fyb3VzYWxfbGFiKSkKCnRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWggJT4lCiAgc3Vic2V0KCFpcy5uYShzZWxmX2Fyb3VzYWxfbGFiKSklPiUKICAKICAKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0CiAgCiAgCiAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgZ3JvdW5kX3ZhbGVuY2VfbGFiLCB0aW1lYmluMiklPiUKICAgIG11dGF0ZShjb3J0ZXN0ID0gY29yLnRlc3QoYXJvdXNhbF9jLCBwdXBfYmFzQ29yKSRlc3RpbWF0ZSklPiUKICBtdXRhdGUocGNvcnRlc3QgPSBjb3IudGVzdChhcm91c2FsX2MsIHB1cF9iYXNDb3IpJHAudmFsdWUpJT4lCiAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgc2VsZl9hcm91c2FsX2xhYiwgdGltZWJpbjIpJT4lCiAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0aW1lcmV6ZXJvMywgeSA9IGNvcnRlc3QpKSsKCiAgc3RhdF9zbW9vdGgoYWVzKGdyb3VwPSBzZWxmX2Fyb3VzYWxfbGFiLCBjb2xvciA9IHNlbGZfYXJvdXNhbF9sYWIpLCBmdW4gPSBtZWFuLGdlb20gPSAibGluZSIsCiAgICAgICAgICAgICAgIHNlID0gRiwgc2l6ZSA9IDEuNSkrCnRoZW1lX2NsYXNzaWMoKSsKICB5bGFiKCJQdXBpbCBzaXplICh6KSIpKwogIHhsYWIoIlRpbWUgKHMpIikrCiAgIyBwJGdyYXBoc3R5bGUrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMDUsIGxpbmV0eXBlID0gImRhc2hlZCIpKwogIHhsaW0oMCw2KQoKCiMgZG9lcyBhcm91c2luZyBzdGltdWxpIGltcGFpcnMgYXBwcmFpc2FsCgoKIHRtcC5kZjRfZnVsbF9zdGltX2Rvd25zX2p1bjIwMjFfd2l0aF9iZWggJT4lCiAgIGdncGxvdChhZXMoZ3JvdW5kX2Fyb3VzYWxfbGFiLCBCUklHSFRORVNTKSkrCiAgIGdlb21fYm94cGxvdCgpKwogICBnZW9tX3BvaW50KCkrCiAgICMgc3RhdF9zdW1tYXJ5KGdlb20gPSAnYm94cGxvdCcpKwogICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpCmBgYAoKCgpgYGB7cn0KIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHB1cGlsX291dGxpZXIgPT0gRkFMU0UgJiBhcm91c2FsX291dGxlciA9PSBGQUxTRSAmICFpcy5uYShBbGV4aXRoeW1pYSkgJiBzc2lkIT0gNjEwKSU+JQogICAgIyBncm91cF9ieShzc2lkLEFsZXhpdGh5bWlhLCBpc192YWxlbmNlX2hpZ2gpJT4lCiAgIGdyb3VwX2J5KHNzaWQsQWxleGl0aHltaWEsIG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSklPiUKICAgIG11dGF0ZShjb3J0ZXN0ID0gY29yLnRlc3QoYXJvdXNhbF9jLCBwdXBfYmFzQ29yKSRlc3RpbWF0ZSklPiUKICAgZ3JvdXBfYnkoc3NpZCxBbGV4aXRoeW1pYSwgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlLCBzZWxmX2Fyb3VzYWxfbGFiKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICAgICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSwgY29ydGVzdCwgY29sb3IgPSBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpKSsKICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIpKwogIAogICAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgICAgICAgc3RhdF9zdW1tYXJ5KCBnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgICAgICAgICMgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gJ2xpbmUnKSsKICAgIHlsYWIoIlIgcHVwaWwgdnMgc2VsZiByZXBvcnQgYXJvdXNhbCIpKwogICAjIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKHBhaXJlZCA9IFRSVUUpKwogICMgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgcGFpcmVkID0gVFJVRSkKICAgICAgZmFjZXRfZ3JpZCh+c2VsZl9hcm91c2FsX2xhYikKCmBgYAoKCgpTQ1IKCmBgYHtyfQoKdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3Qkc3NpZCkKVmlldyhmbGFnX3Bvc19uZWcpCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkbWVkaWFuc3BsaXRfc2VsZl9hcm91c2FsIDwtIGlmX2Vsc2UoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRhcm91c2FsPiBtZWRpYW4oZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRhcm91c2FsLCBuYS5ybSA9IFRSVUUpLCAiSGlnaCIsICJMb3ciKQoKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JG1lZGlhbnNwbGl0X3NlbGZfYXJvdXNhbF90aGlzc2FtcGxlIDwtIGlmX2Vsc2UoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRhcm91c2FsPiBtZWRpYW4oZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRBcm91c2FsTWVhblRoaXNTYW1wbGUsIG5hLnJtID0gVFJVRSksICJIaWdoIiwgIkxvdyIpCgp1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdDIkc3NpZCkKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQ8LSBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgc3NpZF9udW08NTAwKQoKbnJvdyhkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250KQojIDIyMzMKIyBucm93KGxlZnRfam9pbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LCBmbGFnX3Bvc19uZWcpKQoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udDwtIGxlZnRfam9pbihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LCBmbGFnX3Bvc19uZWcpCgoKCnVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHN0aW1EZXNjcmlwdGlvbikKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCAlPiUKICBzdWJzZXQoc3NpZF9udW08IDUwMCklPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICklPiUKICAgICAgIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICBncm91cF9ieShzc2lkKSU+JQogIG11dGF0ZShCSU9fQ0RBLlNDUl96ID0gc2NhbGUoKEJJT19DREEuU0NSKSlbLDFdKSU+JQogIHVuZ3JvdXAoKSU+JQogICAgZ3JvdXBfYnkoc3NpZCxjb3JfcG9zX25lZ19kaWZmX2xhYiwgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X3NlbGZfdmFsZW5jZSwgQklPX0NEQS5TQ1JfeikpKwogICAgICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgCiAgCiAgICAgIyBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjIpKwogIGdlb21faml0dGVyKHdpZHRoID0gLjIsIGFscGhhID0gLjIpKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgY29sb3IgPSAiZ3JheSIsIGFscGhhID0gLjEpKwogICMgZ2VvbV9ib3hwbG90KGFscGhhID0gLjEpKwogICMgZmFjZXRfZ3JpZCh+Y29yX3Bvc19uZWdfZGlmZl9sYWIpKwogIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKCkKCkJJT19DREEuSVNDUl96CgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250ICU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKEJJT19UVFAuQW1wU3VtX3ogPSBzY2FsZShCSU9fVFRQLkFtcFN1bSwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKVssMV0pJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKGFyb3VzYWxfYywgQklPX1RUUC5BbXBTdW1feikpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKQoKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQgJT4lCiAgZ3JvdXBfYnkoc3NpZCxtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpJT4lCiAgIyBtdXRhdGUoQklPX1RUUC5BbXBTdW1feiA9IHNjYWxlKEJJT19UVFAuQW1wU3VtLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXSklPiUKICAjIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsLCBCSU9fQ0RBLklTQ1JfeikpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250ICU+JQogIGdyb3VwX2J5KHNzaWQsbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsX2MsIEJJT19DREEuUGhhc2ljTWF4X3osIGNvbG9yID1tZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCgoKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQgJT4lCiAgZ3JvdXBfYnkoc3NpZCxncm91bmRfYXJvdXNhbF9sYWIpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKGFyb3VzYWxfYywgQklPX0NEQS5QaGFzaWNNYXhfeiwgY29sb3IgPWdyb3VuZF9hcm91c2FsX2xhYikpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKQogIAogIAogIAogIAoKCmBgYAoKIyBzY3IgbW9kZWwKCjwhLS0gIyBhdmVyYWdlIGFyb3VhbCBhbmQgcmF0aW5nIG92ZXIgYWxsIHRyaWFscyBkb24ndCB0cmFjayB3ZWxsIHRoZSBleHBlY3RlZCBhcm91c2FsIHJlbGF0aW9uIC0tPgpgYGB7cn0KCnVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JGNvbmRpdGlvbikKcHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91c2FsX3NjciA8LSBsbWVyKGxvZyhCSU9fQ0RBLlNDUisuMSkgfiBhcm91c2FsX2MqVEFTYyArKDF8c3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX2Fyb3VzYWxfb3V0bGVyID09IEZBTFNFICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UgPT0gIk1vcmUgcG9zaXRpdmUiKSkKCnN1bW1hcnkocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91c2FsX3NjcikKYW5vdmEocHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91c2FsX3BoYXNfbWF4KQoKCkJJT19DREEuUGhhc2ljTWF4CgoKcHVwaWxfYXJvdXNhbF9maW5kaW5ncyRhcm91c2FsX3NjciA8LSBsbWVyKEJJT19DREEuUGhhc2ljTWF4X3ogfiB2YWxlbmNlX2MgKygxK2Fyb3VzYWxfY3xzc2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgUkVNTCA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlID09ICJNb3JlIHBvc2l0aXZlIikpCgpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkYXJvdXNhbF9zY3IpCmFub3ZhKHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkYXJvdXNhbF9waGFzX21heCkKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250ICU+JQogIGdyb3VwX2J5KHNzaWQsIGNvcl9wb3NfbmVnX2RpZmZfbGFiKSU+JQogIGdncGxvdChhZXMoY29yX3Bvc19uZWdfZGlmZl9sYWIsIFRBUykpKwogIGdlb21fcG9pbnQoKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykKYGBgCgpzdW1tYXJ5KHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkYXJvdXNhbF9zY3IpCmFub3ZhKHB1cGlsX2Fyb3VzYWxfZmluZGluZ3MkYXJvdXNhbF9waGFzX21heCkKCgp0ZXN0PC0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIHBwX2Fyb3VzYWxfb3V0bGVyID09IEZBTFNFICYgc3NpZCA9PSAzMTApCnRlc3QkQWxleGl0aHltaWEKdGFibGUodGVzdCRtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpCgojIHRyeSB0aGUgYW5vdmEgZ3JvdXBpbmcKYGBge3J9CgphZmV4Ojphb3ZfZXooZGF0YSA9IChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyID09IEZBTFNFKSU+JQogICAgICAjIHN1YnNldChpc19zY3Jfbm9ucmVzcG9uZGVyID09IEZBTFNFICklPiUKICAgICAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgICAgIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogICAgICAjIGdyb3VwX2J5KHNzaWQsIEFsZXhpdGh5bWlhLG1lZGlhbnNwbGl0X3NlbGZfYXJvdXNhbCwgbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSU+JQogICAgICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSksCiAgICBpZCA9ICJzc2lkIiwKICAgIGJldHdlZW4gPSBOVUxMLAogICAgd2l0aGluID0gYygibWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UiKSwKICAgIGR2ID0gIkJJT19DREEuU0NSX3oiKQoKCgoKY29sbmFtZXMoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCkKCgpnZ2NvcnJwbG90OjpnZ2NvcnJwbG90KGNvcihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0WyxjKDE5LDExNSwxMjU6MTI4LDI3LDI2KV0sIHVzZSA9ICJjb21wbGV0ZSIpKQoKYGBgCgoKICAgIApCSU9fQ0RBLlNDUl96CgojIGluZG92aWR1YWwgcGxvdHMKYGBge3J9CgpmYWNldF9oaXN0X3NjcjwtIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgc3Vic2V0KHNzaWQgPiAzMDMpJT4lCiAgc3Vic2V0KGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICklPiUKICAgICAgIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogIGdncGxvdChhZXMobG9nMXAoQklPX0NEQS5TQ1IrMSkpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gKSsKICBmYWNldF93cmFwKH5zc2lkKQoKYGBgCgoKCiMgd2hhdCdzIHVwIHdpdGggbm9uIHJlc3BvbmRlcnMKCiMgMzEyCiMgMzE4IG9ubHkgb25lIHJzcGluc2U/CiMgMzIwCiMgMzIxCiMgMzI3CiMgMzI5CiMgMzMyCiMgMzM1IChvbmx5IG9uZSByZXNwb25zZSkKIyAzNDIKIyAzNDMKIyA2MDAKIyA2MDMKIyA2MDYgKG9ubHkgb25lIHJlc3BvbnNlKQojIDYwOAojIDkwMAojIDU2LSAxNQoKIyB0aGF0IHdvdWxkIGxlYXZlIHVzIHdpdGggNDEgcGVvcGxlCgpgYGB7cn0KdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3Qkc3NpZCkKCnJhbmdlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkQklPX0NEQS5TQ1IsIG5hLnJtID0gVFJVRSkKCm1lYW4oZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRCSU9fQ0RBLlNDUiwgbmEucm0gPSBUUlVFKQpzZChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JEJJT19DREEuU0NSLCBuYS5ybSA9IFRSVUUpCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JT4lCiAgZ2dwbG90KGFlcyhCSU9fQ0RBLlNDUikpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MDApCiAgeGxpbSgwLC4wMSkKICAKICAKICAKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCU+JQogIHN1YnNldChzc2lkID09IDMxMiklPiUKICBnZ3Bsb3QoYWVzKEJJT19DREEuQW1wU3VtKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDUwMCkrCiAgeGxpbSgwLC4wNSkKCmBgYAoKCmBgYHtyfQpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JGlzX3Njcl9ub25yZXNwb25kZXI8LSBpZl9lbHNlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QkQklPX0NEQS5BbXBTdW08IC4xLCBUUlVFLCBGQUxTRSkKCiBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogIHN1YnNldChzc2lkID4gMzAzKSU+JQogIHN1YnNldChhcm91c2FsX291dGxlciA9PSBGQUxTRSApJT4lCiAgICAgICBzdWJzZXQoIWlzLm5hKEFsZXhpdGh5bWlhKSklPiUKICBnZ3Bsb3QoYWVzKGxvZzFwKEJJT19DREEuU0NSKzEpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9ICkrCiAgIGZhY2V0X2dyaWQofmlzX3Njcl9ub25yZXNwb25kZXIpCiAgZmFjZXRfd3JhcCh+c3NpZCkKICAKICAKICAKICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0JT4lCiAgICBncm91cF9ieShzc2lkLGlzX3Njcl9ub25yZXNwb25kZXIpJT4lCiAgICBtdXRhdGUoc2NyX25vbnJlc3BfcHJvcCA9IG4oKSklPiUKICAgICAgZ3JvdXBfYnkoc3NpZCklPiUKICAgICBtdXRhdGUoc2NyX25vbnJlc3BfcHJvcCA9IHNjcl9ub25yZXNwX3Byb3AvbigpKSU+JQogICAgZ2dwbG90KGFlcyhhcy5mYWN0b3Ioc3NpZCksIHNjcl9ub25yZXNwX3Byb3ApKSsKICAgIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuMiwgd2lkdGggPSAuNSkKICAKICAKIyB0ZXN0PC0gIHN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0LCBzc2lkID09IDMyMSkKICAgIAoKICAKICB0YWJsZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JGlzX3Njcl9ub25yZXNwb25kZXIpCiAgZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCAlPiUKICAgIHN1YnNldChpc19zY3Jfbm9ucmVzcG9uZGVyICE9IEZBTFNFKSU+JQogICAgc3Vic2V0KHBwX2Fyb3VzYWxfb3V0bGVyID09IEZBTFNFKSU+JQogICAgc3Vic2V0KCFzc2lkICVpbiUgYygiMzA0IiwiMzIxIiwgIjMyMyIsICIzMTgiLCIzMzkiLCIzMzEiLCIzMjUiKSklPiUKICAjIHN1YnNldCggYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UgKSU+JQogICAgICAgc3Vic2V0KCFpcy5uYShBbGV4aXRoeW1pYSkpJT4lCiAgIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKEJJT19DREEuU0NSX3ogPSBzY2FsZShsb2cxcChCSU9fQ0RBLlBoYXNpY01heCArLjEpKVssMV0pJT4lCiAgIyB1bmdyb3VwKCklPiUKICAgIGdyb3VwX2J5KHNzaWQsIEFsZXhpdGh5bWlhLG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiwgbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSU+JQogICAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgICMgZ3JvdXBfYnkoc3NpZCklPiUKICAgICMgbXV0YXRlKFNDUl90cmVuZCA9IEJJT19DREEuU0NSX3pbbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwgPT0gIkhpZ2hlciBhcm91c2FsIl0gLQogICAgICAgICAgICAgIyBCSU9fQ0RBLlNDUl96W21lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsID09ICJMb3dlciBhcm91c2FsIl0pCiAgICAjIG11dGF0ZSh0cmVuZHNjciA9IGlmX2Vsc2UoU0NSX3RyZW5kPiAwLCAiaGlnaCB0byBoaWdoIiwgImhpZ2ggdG8gbG93IikpCiAgCiAgICAjIGdyb3VwX2J5KHNzaWQsIEFsZXhpdGh5bWlhLG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLHRyZW5kc2NyKSU+JQogICAgIyBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyLCBCSU9fQ0RBLlNDUl96KSkrCiAgICAgIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScpKwogIAogICAgICMgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC4yKSsKICBnZW9tX2ppdHRlcih3aWR0aCA9IC4yLCBhbHBoYSA9IC4yKQogICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKQogICAgIyBnZW9tX2JveHBsb3QoYWxwaGEgPSAuMSkKICAgICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNzaWQpKQogICAgZmFjZXRfZ3JpZCh+dHJlbmRzY3IpCiAgICAjIHlsaW0oLTEsMSkKICAKICAKMzA0LCAzMTgsIDMzOSwgMzMxLDMyNQoKCgpzY3JfbW9kZWxzPC0gbGlzdCgpCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250ICU+JQogICAgc3Vic2V0KGlzX3Njcl9ub25yZXNwb25kZXIgPT0gRkFMU0UpJT4lCiAgICBzdWJzZXQocHBfYXJvdXNhbF9vdXRsZXIgPT0gRkFMU0UpJT4lCiAgICBzdWJzZXQoIXNzaWQgJWluJSBjKCIzMDQiLCIzMjEiLCAiMzIzIiwgIjMxOCIsIjMzOSIsIjMzMSIsIjMyNSIpKQogICMgc3Vic2V0KCBhcm91c2FsX291dGxlciA9PSBGQUxTRSApJT4lCgoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udF9zY3JfZXhjbHVkaW5nX2F0eXBpY2FsPC0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCU+JQogICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXQoIXNzaWQgJWluJSBjKCIzMDQiLCIzMjEiLCAiMzIzIiwgIjMxOCIsIjMzOSIsIjMzMSIsIjMyNSIpKQogICMgc3Vic2V0KGlzX3Njcl9ub25yZXNwb25kZXIgPT0gRkFMU0UpJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUoQklPX0NEQS5QaGFzaWNNYXhfeiA9IHNjYWxlKEJJT19DREEuUGhhc2ljTWF4LCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXSklPiUKIG11dGF0ZSh2YWxlbmNlX3ogPSBzY2FsZSh2YWxlbmNlLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXSklPiUKICAgIG11dGF0ZShhcm91c2FsX3ogPSBzY2FsZShhcm91c2FsLCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpWywxXSkKCgpzY3JfbW9kZWxzJHNjcl9leGNsdWRpbmdfYXR5cGljYWw8LSBsbWVyKGxvZyhCSU9fQ0RBLlBoYXNpY01heCsuMSkgfiB2YWxlbmNlX3ogKyBhcm91c2FsX3orCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMXwgc3NpZCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnRfc2NyX2V4Y2x1ZGluZ19hdHlwaWNhbCkKCgpzY3JfbW9kZWxzJHNjcl9leGNsdWRpbmdfYXR5cGljYWw8LSBsbWVyKGxvZyhCSU9fQ0RBLlBoYXNpY01heCsuMSkgfiB2YWxlbmNlX2MgKyBhcm91c2FsX2MrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMXwgc3NpZCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250KQogICAgICAgICAgICAgICAgICAgICAgICAjIHN1YnNldCghc3NpZCAlaW4lIGMoIjMwNCIsIjMyMSIsICIzMjMiLCAiMzE4IiwiMzM5IiwiMzMxIiwiMzI1IikpJT4lCiAgc3Vic2V0KGlzX3Njcl9ub25yZXNwb25kZXIgIT0gRkFMU0UpKQogICAgICAgICAgICAgICAgICAgICAgICAgIApzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyX2V4Y2x1ZGluZ19hdHlwaWNhbCkgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAKKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQlPiUKICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2V0KCFzc2lkICVpbiUgYygiMzA0IiwiMzIxIiwgIjMyMyIsICIzMTgiLCIzMzkiLCIzMzEiLCIzMjUiKSkpKQoKc3VtbWFyeShzY3JfbW9kZWxzJHNjcl9leGNsdWRpbmdfYXR5cGljYWwpCmBgYAo8IS0tIG9uZSBvZiB0aGUgd29ycmllcyBJIGhhZCB3YXMgdGhhdCBtYXliZSB0aGVyZSB3YXMgYSBiaWFzIHN1Y2ggdGhhdCB2YWxlbmNlIHdhcyBjb25mb3VuZGVkIHdpdGggYXJvdXNhbCwgYnV0IGlmIHRoaXMgd2FzIHRydWUsIHRoZW4gcG9zaXRpdmUgc3RpbXVsaSB3b3VsO2QgYmUgcmF0ZWQgYXMgbW9yZSBhcm91c2luZyAtLT4KICAKICAKICAgIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgICBzdWJzZXQoaXNfc2NyX25vbnJlc3BvbmRlciA9PSBGQUxTRSklPiUKICAgIHN1YnNldChwcF9hcm91c2FsX291dGxlciA9PSBGQUxTRSklPiUKICBzdWJzZXQoIGFyb3VzYWxfb3V0bGVyID09IEZBTFNFICklPiUKICAgICAgIHN1YnNldCghaXMubmEoQWxleGl0aHltaWEpKSU+JQogICBncm91cF9ieShzc2lkKSU+JQogIG11dGF0ZShCSU9fQ0RBLlNDUl96ID0gc2NhbGUobG9nMXAoQklPX0NEQS5QaGFzaWNNYXggKy4xKSlbLDFdKSU+JQogICAgICBtdXRhdGUoYXJvdXNhbF96ID0gc2NhbGUoYXJvdXNhbCArLjEpKSU+JQogIHVuZ3JvdXAoKSU+JQogICAgIyBncm91cF9ieShzc2lkLCBBbGV4aXRoeW1pYSxtZWRpYW5zcGxpdF9zZWxmX2Fyb3VzYWwpJT4lCiAgICAjIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsX3osIEJJT19DREEuU0NSX3opKSsKICAgICAgZ2VvbV9wb2ludCgpKwogICAgICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgICAgIGZhY2V0X2dyaWQofmdyb3VuZF9hcm91c2FsX2xhYikKICAKICAgICAjIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuMikrCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMiwgYWxwaGEgPSAuMikrCiAgICB5bGltKC0xLDEpCiAgCiAgIyBwYW5lbCBmb3IgbWFueSBmb2xrcwogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgIyBzdWJzZXQoc3NpZCA9PSAzMTQpJT4lCiAgICBncm91cF9ieShzc2lkKSU+JQogICAgbXV0YXRlKEJJT19DREEuU0NSX3ogPSBzY2FsZShsb2cxcChCSU9fQ0RBLlBoYXNpY01heCArLjEpKVssMV0pJT4lCiAgICBtdXRhdGUoYXJvdXNhbF96ID0gc2NhbGUoYXJvdXNhbCArLjEpKSU+JQogIGdncGxvdChhZXMoYXJvdXNhbF96LEJJT19DREEuU0NSX3osIGNvbG9yID1tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSAsIHNoYXBlID1tZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCkpKwogICAgZ2VvbV9wb2ludCgpKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAgIGZhY2V0X3dyYXAofnNzaWQpKwogICAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0ICU+JQogICMgc3Vic2V0KHNzaWQgPT0gMzE0KSU+JQogICAgZ3JvdXBfYnkoc3NpZCklPiUKICAgIG11dGF0ZShCSU9fQ0RBLlNDUl96ID0gc2NhbGUobG9nMXAoQklPX0NEQS5QaGFzaWNNYXggKy4xKSlbLDFdKSU+JQogICAgbXV0YXRlKGFyb3VzYWxfeiA9IHNjYWxlKGFyb3VzYWwgKy4xKSklPiUKICBnZ3Bsb3QoYWVzKHB1cF9iYXNDb3IsQklPX0NEQS5TQ1JfeikpKwogICAgZ2VvbV9wb2ludCgpKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAgIGZhY2V0X3dyYXAofnNzaWQpKwogICAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgICAKICAgIAogICAgICAgIGRiX2Z1bGwgJT4lCiAgIyBzdWJzZXQoc3NpZCA9PSAzMTQpJT4lCiAgICBncm91cF9ieShzc2lkKSU+JQogICAgbXV0YXRlKEJJT19NZWFuX0hSID0gc2NhbGUoQklPX01lYW5fSFIsIHNjYWxlID0gRkFMU0UpWywxXSklPiUKICAgIG11dGF0ZShhcm91c2FsX3ogPSBzY2FsZShhcm91c2FsICsuMSkpJT4lCiAgZ2dwbG90KGFlcyhCSU9fTWVhbl9IUixsb2cxcChCSU9fQ0RBLlBoYXNpY01heCsuMSkpKSsKICAgIGdlb21fcG9pbnQoKSsKICAgIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLG1ldGhvZCA9ICdsbScsIHNlID0gRikKICAgIGZhY2V0X3dyYXAofnNzaWQpKwogICAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgICAKICAgIAogICAgCiAgICAKCgpMZXQncyB0cnkgc29tZSAzIGQgdmlzdWFsaXNhdGlvbnMKY29udGludWUgaGVyZQoKCmBgYGB7cn0KCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250ICU+JQogIGdyb3VwX2J5KHNzaWQsIG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSxzY3JfdXRsKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgc3Vic2V0KHNjcl91dGwgPT0gIm5vdG91dGxpZXIiKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwgLCBCSU9fQ0RBLlBoYXNpY01heF96KSkrCiAgICBnZW9tX2ppdHRlcihhbHBoYSA9IC4xLCB3aWR0aCA9IC4xKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgc3RhdF9zdW1tYXJ5KGFlcyhncm91cCA9IHNzaWQpLCBnZW9tID0gImxpbmUiLCBhbHBoYSA9IC4xKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JT4lCiAgZ2dwbG90KGFlcyhCSU9fQ0RBLlBoYXNpY01heF96KSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQoKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQ8LSBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JT4lCiAgbXV0YXRlKHNjcl91dGwgPSBpZl9lbHNlKEJJT19DREEuUGhhc2ljTWF4X3ogPiA1LCAib3V0bGllciIsICJub3RvdXRsaWVyIikpCiAgCmBgYAoKICAjICsgYXJvdXNhbF9jCiAgCmBgYHtyfQpzY3JfbW9kZWxzJHNjcl9leGNsdWRpbmdfYXR5cGljYWw8LSBsbWVyKGxvZyhCSU9fQ0RBLkFtcFN1bV9jb2xsYXBzZWQrLjEpIH4gIGFyb3VzYWxfYyp2YWxlbmNlX2MgKiBUQVNjKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAgc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIHNjcl91dGwgPT0gIm5vdG91dGxpZXIiKSkKCgpzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyX2V4Y2x1ZGluZ19hdHlwaWNhbCkKcGxvdChzY3JfbW9kZWxzJHNjcl9leGNsdWRpbmdfYXR5cGljYWwpCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3Qoc2NyX21vZGVscyRzY3JfZXhjbHVkaW5nX2F0eXBpY2FsLCBwcmVkID0gYXJvdXNhbF9jLCBtb2R4ID0gdmFsZW5jZV9jLCBtb2QyID0gVEFTYykKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JT4lCiAgZ2dwbG90KGFlcygpKQoKCnNjcl9tb2RlbHMkc2NyMTwtIGxtZXIobG9nKEJJT19DREEuUGhhc2ljTWF4X2NvbGxhcHNlZCsuMSkgfiAgYXJvdXNhbF9jKnZhbGVuY2VfYyAqIFRBU2MrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMXwgc3NpZCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCwgc2NyX3V0bCA9PSAibm90b3V0bGllciIpKQoKc3VtbWFyeShzY3JfbW9kZWxzJHNjcjEpCnNjcl9tb2RlbHMkc2NyMS4yPC0gbG1lcihsb2cxcChCSU9fQ0RBLlBoYXNpY01heCsuMSkgfiAgVEFTYyphcm91c2FsX2MgKiB2YWxlbmNlX2MrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSB8IHNzaWQpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICBzdWJzZXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCwgR3JvdXAgPT0gIk5UIiwgIWlzLm5hKEFsZXhpdGh5bWlhKSkpCgp1bmlxdWUoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdCRzc2lkKQpzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyMS4yKQoKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgZ3JvdXBfYnkoc3NpZCxHcm91cCklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIHN1YnNldChHcm91cCA9PSAiTlQiKSU+JQogIGdncGxvdChhZXMoVEFTKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQoKaW50ZXJhY3Rpb25zOjppbnRlcmFjdF9wbG90KHNjcl9tb2RlbHMkc2NyMSwgcHJlZCA9IGFyb3VzYWxfYywgbW9keCA9IHZhbGVuY2VfYywgbW9kMiA9IFRBU2MpCgoKCnNjcl9tb2RlbHMkc2NyMS4xPC0gbG1lcihDREEuUGhhc2ljTWF4IH4gIGFyb3VzYWxfYyp2YWxlbmNlX2MgKiBUQVNjKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAgc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIHNjcl91dGwgPT0gIm5vdG91dGxpZXIiKSkKCgpzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyMS4xKQoKaW50ZXJhY3Rpb25zOjppbnRlcmFjdF9wbG90KHNjcl9tb2RlbHMkc2NyMS4xLCBwcmVkID0gYXJvdXNhbF9jLCBtb2R4ID0gdmFsZW5jZV9jLCBtb2QyID0gVEFTYykKCgoKCnNjcl9tb2RlbHMkc2NyMjwtIGxtZXIoQklPX0NEQS5JU0NSX2NvbGxhcHNlZCB+ICBhcm91c2FsX2MqdmFsZW5jZV9jICpUQVNjKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAgc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIHNjcl91dGwgPT0gIm5vdG91dGxpZXIiKSkKCgpzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyMikKCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3Qoc2NyX21vZGVscyRzY3IyLCBwcmVkID0gYXJvdXNhbF9jLCBtb2R4ID0gdmFsZW5jZV9jKQoKCnNjcl9tb2RlbHMkc2NyMjwtIGxtZXIoQklPX0NEQS5TQ1JfY29sbGFwc2VkIH4gIGFyb3VzYWxfYyogdmFsZW5jZV9jICpUQVNjKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAgc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QsIEdyb3VwID0gIk5UIikpCgoKc3VtbWFyeShzY3JfbW9kZWxzJHNjcjIpCgoKaW50ZXJhY3Rpb25zOjppbnRlcmFjdF9wbG90KHNjcl9tb2RlbHMkc2NyMiwgcHJlZCA9IGFyb3VzYWxfYywgbW9keCA9IHZhbGVuY2VfYykKCiMgdGhlIGVmZmVjdCBvZiBwdXBpbCBpcyB0aGUgb3Bwb3NpdGUgb24gc2NyCgoKCnNjcl9tb2RlbHMkc2NyMzwtIGxtZXIoQklPX0NEQS5JU0NSX2NvbGxhcHNlZCB+ICBhcm91c2FsX2MgKiB2YWxlbmNlX2MgKiBUQVNjKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8IHNzaWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIHwgc3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICBSRU1MID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAgc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIHNjcl91dGwgPT0gIm5vdG91dGxpZXIiKSkKCgpzdW1tYXJ5KHNjcl9tb2RlbHMkc2NyMykKCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3Qoc2NyX21vZGVscyRzY3IyLCBwcmVkID0gYXJvdXNhbF9jLCBtb2R4ID0gdmFsZW5jZV9jLCBtb2QyID0gVEFTYykKCiMgdGhlIGVmZmVjdCBvZiBwdXBpbCBpcyB0aGUgb3Bwb3NpdGUgb24gc2NyCgoKYGBgCgoKY2hlY2sgc2NyIG9uIHdpdGhpbiBpbmRpdmlkdWFscwoKYGBge3J9CgpsbV9vYmp0ZXN0PC0gbG0oQklPX0NEQS5QaGFzaWNNYXhfeiB+IGFyb3VzYWwgKiB2YWxlbmNlLCBkYXRhID0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCkKbG1fb2JqdGVzdF9zdW1tPC1zdW1tYXJ5KGxtX29ianRlc3QpCmxtX29ianRlc3Rfc3VtbSRjb2VmZmljaWVudHMKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udAoKbG1fb2JqdGVzdFtbImNvZWZmaWNpZW50cyJdXVtbMl1dCmxtX29ianRlc3RbWyJjb2VmZmljaWVudHMiXV1bWyJhcm91c2FsIl1dCmxtX29ianRlc3RbWyJjb2VmZmljaWVudHMiXV1bWyJ2YWxlbmNlIl1dCgpyZWdyZXNzaW9uX2RmIDwtIGRhdGEuZnJhbWUoc3NpZD0gcmVwKE5BLCA1MCksIEVzdGltYXRlX2Fyb3VzYWw9IHJlcChOQSwgNTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlX3ZhbGVuY2U9IHJlcChOQSwgNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgRXN0aW1hdGVfaW50PSByZXAoTkEsIDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfYXJvdXNhbD0gcmVwKE5BLCA1MCksIAogICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxlbmNlPSByZXAoTkEsIDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfaW50PSByZXAoTkEsIDUwKSkKCgoKbG1faW5kX3N1bW1hcnkkY29lZmZpY2llbnRzW1sxNF1dCgpzc2lkPC0gdW5pcXVlKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkc3NpZCkKCgpkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250PC0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKGFyb3VzYWxfel9zc2lkID0gc2NhbGUoYXJvdXNhbCAtIG1lYW4oYXJvdXNhbCwgbmEucm0gPSBUUlVFKSlbLDFdLAogICAgICAgICB2YWxlbmNlX3pfc3NpZCA9IHNjYWxlKHZhbGVuY2UgLSBtZWFuKHZhbGVuY2UsIG5hLnJtID0gVFJVRSkpWywxXSkKCmkgPSAxCgpybShiKQoKIyBkZWJ1Zwpzc2lkX3RlczwtIHVuaXF1ZShkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHNzaWRfbnVtKQoKdGFibGUoaXMubmEoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCRCSU9fQ0RBLlBoYXNpY01heF96KSkKbG1faW5kICA8LSBsbShCSU9fQ0RBLlBoYXNpY01heF96IH4gYXJvdXNhbF96X3NzaWQgKnZhbGVuY2Vfel9zc2lkLAogICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LCAhaXMubmEoQklPX0NEQS5QaGFzaWNNYXhfeikgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkX251bSA9PSBzc2lkX3Rlc1sxMF0pKQoKCnN1YnNldChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LCAhaXMubmEoQklPX0NEQS5QaGFzaWNNYXhfeikgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkX251bSA9PSBzc2lkX3Rlc1sxMF0pCgoKCmBgYAoKCmBgYHtyfQppID0gMQpybShiKQoKZm9yIChiIGluIDU6bGVuZ3RoKHNzaWRfdGVzKSkgewogICMgZm9yIChzIGluIDE6bGVuZ3RoKG5zaW0pKSB7CgogICAgbWVzc2FnZShzcHJpbnRmKCIkJCQkJFJVTklORyBsbWVyIGZvciBzc2lkICVpIiwgc3NpZF90ZXNbYl0pKQogICAgIyBkYl9vZjdfbmV3X0pFRkZFJFZpZGVvVHlwZV9jb250cmFzdF9zYW1wbGU8LSBzYW1wbGUoKHJlcChjKC0uNSwgLjUpLCBlYWNoID0gIDE5MjApKSwgcmVwbGFjZSA9IEZBTFNFKSAKICAgICAgICAjcnVuIHRoZSBtb2RlbCBvbiB0aGUgY3VycmVudCB0aW1lIGJpbiBhbmQgc2ltdWxhdGlvbiBzdW1iZXIKICAgICAgICBsbV9pbmQgIDwtIGxtKEJJT19DREEuUGhhc2ljTWF4X3ogfiBhcm91c2FsX3pfc3NpZCAqdmFsZW5jZV96X3NzaWQsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsICFpcy5uYShCSU9fQ0RBLlBoYXNpY01heF96KSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSA9PSAiTW9yZSBuZWdhdGl2ZSImCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2lkX251bSA9PSBzc2lkX3Rlc1tiXSkpCgogICAgICAgICNzdG9yZSByZXN1bHRzIGZyb20gdGhlIHNpbXVsYXRpb24KICAgICAgICAgICAgbG1faW5kX3N1bW1hcnk8LSBzdW1tYXJ5KGxtX2luZCkKICAgICAgICAgICAgcmVncmVzc2lvbl9kZltpLDFdPC0gc3NpZF90ZXNbYl0gI3NhdmUgc3NpZAogICAgICAgICAgICByZWdyZXNzaW9uX2RmW2ksMl08LSBsbV9pbmRfc3VtbWFyeSRjb2VmZmljaWVudHNbWzJdXSAjIGFyb3VzYWwgYmV0YQogICAgICAgICAgICByZWdyZXNzaW9uX2RmW2ksM108LWxtX2luZF9zdW1tYXJ5JGNvZWZmaWNpZW50c1tbM11dICMgdmFsZW5jZSBiZXRhCiAgICAgICAgICAgIHJlZ3Jlc3Npb25fZGZbaSw0XTwtbG1faW5kX3N1bW1hcnkkY29lZmZpY2llbnRzW1s0XV0gIyBpbnl0ZXJhY3Rpb24gYmV0YQogICAgICAgICAgICByZWdyZXNzaW9uX2RmW2ksNF08LWxtX2luZF9zdW1tYXJ5JGNvZWZmaWNpZW50c1tbNF1dIAogICAgICAgICAgICByZWdyZXNzaW9uX2RmW2ksNV08LSBsbV9pbmRfc3VtbWFyeSRjb2VmZmljaWVudHNbWzE0XV0KICAgICAgICAgICAgcmVncmVzc2lvbl9kZltpLDZdPC0gbG1faW5kX3N1bW1hcnkkY29lZmZpY2llbnRzW1sxNV1dCiAgICAgICAgICAgIHJlZ3Jlc3Npb25fZGZbaSw3XTwtIGxtX2luZF9zdW1tYXJ5JGNvZWZmaWNpZW50c1tbMTZdXQogICAgICAgICAgICAKICAgICAgICAgICAgbG1faW5kX3N1bW1hcnkkY29lZmZpY2llbnRzW1sxNF1dCiAgICAgICAgICAgICMgc2ltdWxhdGVkX2NsdXN0ZXJzX0pFRkZFW2ksNl08LSBuc2ltW3NdICNzdG9yZSBzaW11bGF0aW9uIG91bnQKICAgICAgICAgICAgIyB0aW1lY291cnNlX3Jlc3VsdF9kZl9uZWdbaSw1XSA8LWlmZWxzZShsZW5ndGgobG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSkKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSAwLAogICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1lcl9iaW5fcHVwX3N1bW1hcnkkb3B0aW5mbyRjb252JGxtZTQkbWVzc2FnZSwgJ3Bhc3MnKQoKICAgICBpID0gaSsxCn0KCgpWaWV3KHJlZ3Jlc3Npb25fZGYpCgogbG1faW5kX3N1bW1hcnkkY29lZmZpY2llbnRzW1s0XV0KIyB3aGV0aGVyIEkgdXNlIGdyb3VuZCB2YWxlbmNlLCBzZWxmIHZhbGVtY2Ugb3IgdGhpcyBzYW1wbGUgYXZlcmFnZSB2YWxlbmNlLCBJIGdldCB0aGUgc2FtZSBwYXR0ZXJucwoKdGltZWNvdXJzZV9yZXN1bHRfZGZfbmVnJT4lCiAgZ2dwbG90KGFlcyh0aW1lYmlucywgdCkpKwogIGdlb21fbGluZShzaXplID0gMikrCiAgZ2VvbV9saW5lKGFlcyh5ID0gcCksIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAyKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAuMSwgY29sb3IgPSAncmVkJywgc2l6ZSA9IDEuNSkKCgp0LnRlc3QocmVncmVzc2lvbl9kZiRFc3RpbWF0ZV9hcm91c2FsKQoKc3NpZCMganVzdCBwb3NpdGl2ZQpyZWdyZXNzaW9uX2RmIDwtIGRhdGEuZnJhbWUoc3NpZD0gcmVwKE5BLCA1MCksIEVzdGltYXRlX2Fyb3VzYWw9IHJlcChOQSwgNTApLCAKICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlX3ZhbGVuY2U9IHJlcChOQSwgNTApLAogICAgICAgICAgICAgICAgICAgICAgICAgRXN0aW1hdGVfaW50PSByZXAoTkEsIDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfYXJvdXNhbD0gcmVwKE5BLCA1MCksIAogICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxlbmNlPSByZXAoTkEsIDUwKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBfaW50PSByZXAoTkEsIDUwKSkKCgpgYGAKCgoKCgoKCgoKYGBge3J9CgpzY2F0dGVyM0QoeCwgeSwgeiwgY2xhYiA9IGMoIlNlcGFsIiwgIldpZHRoIChjbSkiKSkKCmRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQKCmluc3RhbGwucGFja2FnZXMoInBsb3QzRCIpCmluc3RhbGwucGFja2FnZXMoIm1pc2MzZCIpCmxpYnJhcnkobWlzYykKCnBsb3QzRDo6c2NhdHRlcjNEKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkcHVwX2Jhc0NvciwgCiAgICAgICAgICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JGFyb3VzYWxfYywgCiAgICAgICAgICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHZhbGVuY2VfYykKCiBpbnN0YWxsLnBhY2thZ2VzKCJwbG90M0QiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQogCiAgaW5zdGFsbC5wYWNrYWdlcygibWlzYzNkIiwgcmVwbyA9ICdodHRwczovL21hYy5SLXByb2plY3Qub3JnJykKIAogCmluc3RhbGwucGFja2FnZXMoYygicmdsIiwgImNhciIpKQoKbGlicmFyeShjYXIpCgppbnN0YWxsLnBhY2thZ2VzKCJjYXIiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQoKCmNhcjo6c2NhdHRlcjNkKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkYXJvdXNhbF9jLCAKICAgICAgICAgIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkcHVwX2Jhc0NvciwgCiAgICAgICAgICBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHZhbGVuY2VfYywKICAgICAgICAgIGZpdCA9ICJzbW9vdGgiCiAgICAgICAgICAjIHBvaW50ID0gRkFMU0UsCiAgICAgICAgICAKICAgICAgICAgICMgc3VyZmFjZSA9IEZBTFNFLAogICAgICAgICAgIyBwb2ludC5jb2wgPSAiIgogICAgICAgICAgKQoKCmBgYAoKCgpnZyA9IGdncGxvdChkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250LCBhZXMoQklPX0NEQS5QaGFzaWNNYXhfeiwgYXJvdXNhbF9jKSkgKwogIHN0YXRfZGVuc2l0eV8yZChhZXMoZmlsbCA9IHN0YXQoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCR2YWxlbmNlX2MpKSwgCiAgICAgICAgICAgICAgICAgIGdlb20gPSAicG9seWdvbiIsCiAgICAgICAgICAgICAgICAgIG4gPSAxMDAsYmlucyA9IDEwLGNvbnRvdXIgPSBUUlVFKSArCiAgIyBmYWNldF93cmFwKGNsYXJpdHl+LikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJBIikKCnJheXNoYWRlcjo6cGxvdF9nZyhnZyxtdWx0aWNvcmU9VFJVRSx3aWR0aD01LGhlaWdodD01LHNjYWxlPTI1MCkKCnNjcjwtIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkQklPX0NEQS5QaGFzaWNNYXhfegphcm91c2FsPC0gZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCRhcm91c2FsX2MKCnZhbGVuY2UgPSBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHZhbGVuY2VfYwoKCgoKZ2cgPSBnZ3Bsb3QoZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdF9udCwgYWVzKEJJT19DREEuUGhhc2ljTWF4X3osIGFyb3VzYWxfYykpICsKICBzdGF0X2RlbnNpdHlfMmQoYWVzKGZpbGwgPSBzdGF0KHZhbGVuY2VfYykpLCAKICAgICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2x5Z29uIiwKICAgICAgICAgICAgICAgICAgIyBuID0gMTAwLGJpbnMgPSAxMCwKICAgICAgICAgICAgICAgICAgY29udG91ciA9IFRSVUUpICsKICAjIGZhY2V0X3dyYXAoY2xhcml0eX4uKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIkEiKQpyYXlzaGFkZXI6OnBsb3RfZ2coZ2csbXVsdGljb3JlPVRSVUUsd2lkdGg9NSxoZWlnaHQ9NSxzY2FsZT0yNTApCmdnCiNObyBsaW5lcwpwcF9ub2xpbmVzID0gZ2dwbG90KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIGFlcyh4PUJJT19DREEuUGhhc2ljTWF4X3osIHk9YXJvdXNhbF9jKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gdmFsZW5jZV9jKSkKICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhhKQoKcmF5c2hhZGVyOjpwbG90X2dnKHBwX25vbGluZXMsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNCwgc2NhbGUgPSAzMDAsIG11bHRpY29yZSA9IFRSVUUpCnBwX25vbGluZXMKCgo/c2NhdHRlcjNkCnNjYXR0ZXIzZCh4ID0gYXJvdXNhbCwgCiAgICAgICAgICB5ID0gdmFsZW5jZSwgeiA9IHNjciwgCiAgICAgICAgICBmaXQgPSAic21vb3RoIiwKICAgICAgICAgIAogICAgICAgICAgIyBzdXJmYWNlID0gRkFMU0UsCiAgICAgICAgICBwb2ludC5jb2wgPSAiYmx1ZSIsIAogICAgICAgICAgIyBwb2ludAogICAgICAgICAgZ3JvdXBzID0gYXMuZmFjdG9yKGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSwgCiAgICAgICAgICBlbGxpcHNvaWQgPSBGQUxTRSkKCgoKc2NhdHRlcjNkKHggPSBkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JHB1cF9iYXNDb3IsIAogICAgICAgICAgeSA9IGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQkQklPX0NEQS5QaGFzaWNNYXhfeiwgeiA9IGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQsIAogICAgICAgICAgZml0ID0gInNtb290aCIsCiAgICAgICAgICAKICAgICAgICAgICMgc3VyZmFjZSA9IEZBTFNFLAogICAgICAgICAgcG9pbnQuY29sID0gImJsdWUiLCAKICAgICAgICAgICMgcG9pbnQKICAgICAgICAgIGdyb3VwcyA9IGFzLmZhY3RvcihkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0X250JG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSwgCiAgICAgICAgICBlbGxpcHNvaWQgPSBGQUxTRSkKCgpsaWJyYXJ5KHZpcmlkaXNMaXRlKQppbnN0YWxsLnBhY2thZ2VzKCJ2aXJpZGlzIikKbGlicmFyeSh2aXJpZGlzKQpkZWF0aGdnID0gZ2dwbG90KGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3RfbnQpICsKICBnZW9tX3RpbGUoYWVzKHg9YXJvdXNhbF9jLHk9cHVwX2Jhc0NvcixmaWxsPXZhbGVuY2VfYykpKwogICMgc2NhbGVfeF9jb250aW51b3VzKCJZZWFyIixleHBhbmQ9YygwLDApLGJyZWFrcz1zZXEoMTkwMCwyMDEwLDEwKSkgKwogICMgc2NhbGVfeV9jb250aW51b3VzKCJBZ2UiLGV4cGFuZD1jKDAsMCksYnJlYWtzPXNlcSgwLDEwMCwxMCksbGltaXRzPWMoMCwxMDApKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkKICAjIGdndGl0bGUoIkRlYXRoIFByb2JhYmlsaXR5IHZzIEFnZSBhbmQgWWVhciBmb3IgdGhlIFVTQSIpICsKICAjIGxhYnMoY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogVVMgRGVwdC4gb2YgU29jaWFsIFNlY3VyaXR5IikKICAKcmF5c2hhZGVyOjogcGxvdF9nZyhkZWF0aGdnLCBtdWx0aWNvcmU9VFJVRSkKaGVpZ2h0PTUsd2lkdGg9NixzY2FsZT01MDAKCmBgYAoKaGVhcnQgcmF0ZQoKCmBgYHtyfQoKCgoKCnVuaXF1ZShkYl9mdWxsNm5ldyRCaW9fTWVhbl9IUikKdW5pcXVlKGRiX2Z1bGw2bmV3JEJpb19NZWFuX0hSX2ZpeCkKCgpWaWV3KGRiX2Z1bGw2bmV3KQoKZGJfZnVsbDRuZXdfc3RpbV9zY3JlZW5fcHVwaWxfbm9wcmFjdAogIGRiX2Z1bGw0bmV3X3N0aW1fc2NyZWVuX3B1cGlsX25vcHJhY3QgJT4lCiAgIyBzdWJzZXQoc3NpZCA9PSAzMTQpJT4lCiAgICBncm91cF9ieShzc2lkKSU+JQogICAgbXV0YXRlKEJJT19DREEuU0NSX3ogPSBzY2FsZShsb2cxcChCSU9fQ0RBLlBoYXNpY01heCArLjEpKVssMV0pJT4lCiAgICBtdXRhdGUoYXJvdXNhbF96ID0gc2NhbGUoYXJvdXNhbCArLjEpKSU+JQogIGdncGxvdChhZXMoYXJvdXNhbF96LEJJT19DREEuU0NSX3osIGNvbG9yID1tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSAsIHNoYXBlID1tZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCkpKwogICAgZ2VvbV9wb2ludCgpKwogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAgIGZhY2V0X3dyYXAofnNzaWQpKwogICAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKYGBgCgoKYGBgCgpgYGB7cn0KCiMga2VlcCBzdGltIGFuZCBhbmQgZml4YXRpb24KCnVuaXF1ZShkYl9mdWxsNm5ldyRzY3JlZW5jb250ZW50KQp1bmlxdWUoZGJfZnVsbDZuZXckc2NyZWVuY29udGVudF9ubykKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW08LSBzdWJzZXQoZGJfZnVsbDZuZXcsIHNjcmVlbmNvbnRlbnRfbm8gPDMpClZpZXcoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW0pCiMgZml4YXRpb24iICAgICJzdGltIiAKCiMga2VlcCBjb250cm9scwp1bmlxdWUoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW0kc3NpZCkKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW0kc3NpZF9udW0gPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW0kc3NpZCkpCgoKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250PC0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltLCBHcm91cCA9PSAiTlQiKQp1bmlxdWUoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQkc3NpZF9udW0pCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDwtIHN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbSwgc3NpZF9udW0+IDMwMykKdW5pcXVlKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JHNzaWQpCgojIEhSIGRpZmZlcmVuY2VzCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JEJpb19NZWFuX0hSX2ZpeDwtIGlmX2Vsc2UoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQkc2NyZWVuY29udGVudF9ubyA9PTEsIGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250JEJpb19NZWFuX0hSLCBOVUxMKQoKVmlldyhkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udCkKCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDE8LSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udCAlPiUKICBncm91cF9ieShzc2lkLCB0Tm8pICU+JQogIGFycmFuZ2Uoc3NpZCwgdE5vLHNjcmVlbmNvbnRlbnRfbm8pJT4lCiAgZmlsbChCaW9fTWVhbl9IUl9maXgsIC5kaXJlY3Rpb24gPSAiZG93biIpJT4lCiAgc3Vic2V0KHNjcmVlbmNvbnRlbnRfbm8gPT0gMikKClZpZXcoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxKQoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxPC0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxICU+JQogIG11dGF0ZShCaW9fTWVhbl9IUl9kaWYgPSBCaW9fTWVhbl9IUiAtIEJpb19NZWFuX0hSX2ZpeCkKIyAyIDEKc3RpbSAtIGZpeApkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBnZ3Bsb3QoYWVzKEJpb19NZWFuX0hSX2RpZikpKwogIGdlb21faGlzdG9ncmFtKCkKCj9zY2F0dGVyM2QgCgoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJT4lCiAgc3Vic2V0KCFpcy5uYShwdXBfYmFzQ29yKSklPiUKICAgc3Vic2V0KCFpcy5uYShCSU9fQ0RBLlBoYXNpY01heF96KSklPiUKICBzdWJzZXQoIWlzLm5hKEJpb19NZWFuX0hSX2RpZikpCgoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxPC0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUoQklPX0NEQS5QaGFzaWNNYXhfej0gc2NhbGUoQklPX0NEQS5QaGFzaWNNYXgsIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSlbLDFdKQoKc2NhdHRlcjNkKHggPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkcHVwX2Jhc0NvciwgCiAgICAgICAgICB5ID0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJJT19DREEuUGhhc2ljTWF4X3osIAogICAgICAgICAgeiA9IGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSRCaW9fTWVhbl9IUl9kaWYsIAogICAgICAgICAgZml0ID0gInNtb290aCIsCiAgICAgICAgICAKICAgICAgICAgIHN1cmZhY2UgPSBGQUxTRSwKICAgICAgICAgIHBvaW50LmNvbCA9ICJibHVlIiwKICAgICAgICAgICMgcG9pbnQKICAgICAgICAgIGdyb3VwcyA9IGFzLmZhY3RvcihkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwpLAogICAgICAgICAgZWxsaXBzb2lkID0gVFJVRSkKCgoKY29yKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MVssYygicHVwX2Jhc0NvciIsICJCSU9fQ0RBLlBoYXNpY01heF96IiwiQmlvX01lYW5fSFJfZGlmIildLCB1c2UgPSAiY29tcGxldGUiKQoKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhwdXBfYmFzQ29yLEJJT19DREEuUGhhc2ljTWF4X3osIGNvbG9yPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIHlsaW0oMCwuNCkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JQogICMgZ3JvdXBfYnkoc3NpZCklPiUKICAjIG11dGF0ZShCaW9fTWVhbl9IUl9kaWZfeiA9IHNjYWxlKEJpb19NZWFuX0hSX2RpZikpCiAgZ3JvdXBfYnkoc3NpZCxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMocHVwX2Jhc0NvcixCaW9fTWVhbl9IUl9kaWZfeiwgY29sb3I9IG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgIyB5bGltKC03LDIpKwogIGdncHVicjo6c3RhdF9jb3IoKQoKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSklPiUKICAjIGdyb3VwX2J5KHNzaWQpJT4lCiAgIyBtdXRhdGUoQmlvX01lYW5fSFJfZGlmX3ogPSBzY2FsZShCaW9fTWVhbl9IUl9kaWYpKQogIGdyb3VwX2J5KHNzaWQsbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKEJJT19DREEuUGhhc2ljTWF4X3osQmlvX01lYW5fSFJfZGlmLCBjb2xvcj0gbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAjIHlsaW0oLTcsMikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKQogIAoKYGBgCgoKYGBge3J9CgoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJpb19NZWFuX0hSX2RpZl9vdXRsPC0gaWZfZWxzZShhYnMoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJpb19NZWFuX0hSX2RpZik+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWFuKGFicyhkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkQmlvX01lYW5fSFJfZGlmKSxuYS5ybSA9IFRSVUUpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0KihzZChhYnMoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJpb19NZWFuX0hSX2RpZiksIG5hLnJtID0gVFJVRSkpKSksICJvdXRsaWVyIiwgIm5vdCBvdXRsaWVyIikKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBnZ3Bsb3QoYWVzKEJpb19NZWFuX0hSX2RpZikpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgZmFjZXRfZ3JpZCh+QmlvX01lYW5fSFJfZGlmX291dGwpCgpgYGAKCgpgYGB7cn0KZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxICU+JQogICAgc3Vic2V0KEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIpJT4lCiAgc3Vic2V0KHNzaWRfbnVtPDUwMCklPiUKICBncm91cF9ieShzc2lkKSU+JQogIG11dGF0ZShCaW9fTWVhbl9IUl9kaWZfc3NpZCA9IG1lYW4oQmlvX01lYW5fSFJfZGlmLCBuYS5ybSA9IFRSVUUpKSU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgIyBtdXRhdGUoQmlvX01lYW5fSFJfZGlmX3N0aW0gPSBtZWFuKEJpb19NZWFuX0hSX2RpZiwgbmEucm0gPSBUUlVFKSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoVEFTYywgQmlvX01lYW5fSFJfZGlmKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEgJT4lCiAgICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiklPiUKICBzdWJzZXQoc3NpZF9udW08NTAwKSU+JQogICMgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUoQmlvX01lYW5fSFJfZGlmID0gYWJzKEJpb19NZWFuX0hSX2RpZikpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgc3RpbUlBUFMpJT4lCiAgbXV0YXRlKEJpb19NZWFuX0hSX2RpZl9zdGltID0gYWJzKEJpb19NZWFuX0hSX2RpZikpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFRBU2MsIEJpb19NZWFuX0hSX2RpZikpKwogICMgZ2VvbV9wb2ludCgpCiAgCiAgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gc3RpbUlBUFMsIHkgPUJpb19NZWFuX0hSX2RpZl9zdGltKSwgbWV0aG9kPWxtLCBzZT1GQUxTRSwgY29sb3VyID0gImdyYXk0MCIsIGFscGhhID0gLjAxLGxpbmV0eXBlPSJkYXNoZWQiLCBzaXplID0gLjIgKSsKICBnZW9tX3Ntb290aCggbWV0aG9kPWxtLCBzZT1GQUxTRSwgbGluZXR5cGU9ImRhc2hlZCIsCiAgICAgICAgICAgICBjb2xvcj0iZGFya3JlZCIsIHNpemUgPSAyKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJywgcGNoID0gMSkrCiAgCiAgCiAgCiAgIyBnZW9tX3BvaW50KCkrCiAgIyBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID1zc2lkLCB5ID0gQmlvX01lYW5fSFJfZGlmKSxtZXRob2QgPSAibGluZSIsYWxwaGEgPSAuMSkrCiAgIyBnZ3B1YnI6OnN0YXRfY29yKCkrCiAgcCRncmFwaHN0eWxlKwogIHhsYWIoIkFsZXhpdGh5bWlhIChaKSIpKwogIHlsYWIoIkhSIGRpZmZlcmVuY2UiKSsKcCRncmFwaHN0eWxlCgoKCmhyX2JpbyA8LSBsbWVyKEJpb19NZWFuX0hSX2RpZiB+IFRBU2MgKmFyb3VzYWxfYyArICgxfHNzaWQpICsgKDF8IHN0aW1JQVBTKSwKICAgICBSRU1MID0gRkFMU0UsCiAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEsIEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIpKQoKCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChocl9iaW8sIHByZWQgPSBhcm91c2FsX2MsIG1vZHggPSBUQVNjKQoKCnN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEsIEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIpCgoKYGBgCgpgYGB7cn0KZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxICU+JQogIHN1YnNldChCaW9fTWVhbl9IUl9kaWZfb3V0bCA9PSAibm90IG91dGxpZXIiKSU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKGNvcl9ocmRpZl9hciA9IGNvcihCaW9fTWVhbl9IUl9kaWYsIGFyb3VzYWxfYykpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFRBUywgY29yX2hyZGlmX2FyKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpKwogIHAkZ3JhcGhzdHlsZQoKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEgJT4lCiAgc3Vic2V0KFRBUzw3MCklPiUKICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiklPiUKICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSU+JQogIG11dGF0ZShjb3JfaHJkaWZfYXIgPSBjb3IoQmlvX01lYW5fSFJfZGlmLCBhcm91c2FsX2MpKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgY29yX2hyZGlmX2FyKSkrCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAuMSwgd2lkdGggPSAuMSkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkrCiAgcCRncmFwaHN0eWxlCiAgCmBgYAoKCgoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxICU+JQogICMgc3Vic2V0KEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIpJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUoY29yX2hyZGlmX2FyID0gY29yKEJpb19NZWFuX0hSX2RpZiwgYXJvdXNhbF9jKSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoVEFTLCBjb3JfaHJkaWZfYXIpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCmBgYHtyfQpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDE8LSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBncm91cF9ieShzdGltSUFQUyklPiUKICBtdXRhdGUoVmFsZW5jZU1lYW5UaGlzU2FtcGxlID0gbWVhbih2YWxlbmNlLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgQXJvdXNhbE1lYW5UaGlzU2FtcGxlID0gbWVhbihhcm91c2FsLCBuYS5ybSA9IFRSVUUpKQoKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MTwtIGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JQogIHVuZ3JvdXAoKSU+JQogIG11dGF0ZShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSA9IGlmX2Vsc2UoVmFsZW5jZU1lYW4gPj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4oVmFsZW5jZU1lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksICJNb3JlIHBvc2l0aXZlIiwgIk1vcmUgbmVnYXRpdmUiKSklPiUKICBtdXRhdGUobWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwgPSBpZl9lbHNlKEFyb3VzYWxNZWFuID49CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFuKEFyb3VzYWxNZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLCAiSGlnaCIsICJMb3ciKSklPiUKICAgIG11dGF0ZShtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIgPSBpZl9lbHNlKFZhbGVuY2VNZWFuVGhpc1NhbXBsZSA+PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbihWYWxlbmNlTWVhblRoaXNTYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksICJNb3JlIHBvc2l0aXZlIiwgIk1vcmUgbmVnYXRpdmUiKSklPiUKICBtdXRhdGUobWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyID0gaWZfZWxzZShBcm91c2FsTWVhblRoaXNTYW1wbGUgPj0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4oQXJvdXNhbE1lYW5UaGlzU2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLCAiSGlnaCIsICJMb3ciKSkKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiklPiUKICBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSklPiUKICBncm91cF9ieShzc2lkLG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBCaW9fTWVhbl9IUl9kaWYpKSsKICBnZW9tX2ppdHRlcihhbHBoYSA9IC4yLCB3aWR0aCA9IC4yKSsKICAgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgIyBzdGF0X3Ntb290aChhZXMoZ3JvdXAgPSBzc2lkKSwgc2UgPSBGLCBtZXRob2QgPSAnbG0nLCBhbHBoYSA9IC4yKSsKICAgIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKQogIApgYGAKCmBgYHtyfSAgCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKSU+JQogIHN1YnNldChCaW9fTWVhbl9IUl9kaWZfb3V0bD09ICJub3Qgb3V0bGllciIpJT4lCiAgZ3JvdXBfYnkoc3NpZCwgbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwsbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsLCBCaW9fTWVhbl9IUl9kaWYsIGZpbGwgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpKwogIGdlb21faml0dGVyKGFscGhhID0gLjIsIHdpZHRoID0gLjIpKwogICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjIpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICBzdGF0X3N1bW1hcnkoYWVzKGdyb3VwID0gc3NpZCksIGdlb20gPSAnbGluZScsIGFscGhhID0gLjIpKwogIAogCiAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogICAgIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKCkKICAjIHAkZ3JhcGhzdHlsZSsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikrCgoKYGBgCiAgIyBzdGF0X3Ntb290aChhZXMoZ3JvdXAgPSBzc2lkKSwgc2UgPSBGLCBtZXRob2QgPSAnbG0nLCBhbHBoYSA9IC4yKQoKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKSU+JQogIHN1YnNldChCaW9fTWVhbl9IUl9kaWZfb3V0bCE9ICJvdXRsaWVyIiklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9ncm91bmRfYXJvdXNhbCxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwsIEJpb19NZWFuX0hSX2RpZikpKwogIGdlb21faml0dGVyKGFscGhhID0gLjIsIHdpZHRoID0gLjIpKwogICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjIpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKQoKCiMgc2VsZiAKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSU+JQogIHN1YnNldCghaXMubmEobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKSU+JQogIHN1YnNldChCaW9fTWVhbl9IUl9kaWZfb3V0bCE9ICJvdXRsaWVyIiklPiUKICBncm91cF9ieShzc2lkLCBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIEJpb19NZWFuX0hSX2RpZikpKwogIGdlb21faml0dGVyKGFscGhhID0gLjIsIHdpZHRoID0gLjIpKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSwgc2l6ZSA9IC40LCBjb2xvdXIgPSAiQmxhY2siKSArCiAgICMgZ2VvbV9iYXIoc3RhdD0ic3VtbWFyeSIsIGZ1bi55ID0gIm1lYW4iLCBhbHBoYSA9IC4yKSsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykrCiAgZ2dwdWJyOjpzdGF0X2NvbXBhcmVfbWVhbnMoKSsKICBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpCgoKCmxtZXIoCiAgZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxKQoKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQoKYGBge3J9CiMgdGVzdCAtIGFuYWx5c2UganVzdCBwb3NpdGl2ZQpocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsIDwtIGxtZXIoQmlvX01lYW5fSFJfZGlmIH4gIHZhbGVuY2VfYyAqYXJvdXNhbF9jKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IHNzaWQpICsgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMXxtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpLAogICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UgPT0gIk1vcmUgcG9zaXRpdmUiICYgQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiAgJiBHcm91cCA9PSAiTlQiKSkKCgpzdW1tYXJ5KGhyX2RpZl9tb2RlbHMkYXJvdXNhbF92YWwpCgoKdW5pcXVlKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSRzc2lkKQpocl9kaWZfbW9kZWxzJHZhbGZyb21faHIgPC0gbG1lcih2YWxlbmNlX2MgfiAgIEJpb19NZWFuX0hSX2RpZiogYXJvdXNhbF9jKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IHNzaWQpICsgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMXxtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpLAogICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UgPT0gIk1vcmUgcG9zaXRpdmUiICYKICAgICAgICAgICAgICAgICAgIEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIgJiBHcm91cCA9PSAiTlQiKSkKYXJvdXNhbF9jCgoKc3VtbWFyeShocl9kaWZfbW9kZWxzJHZhbGZyb21faHIpCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QoaHJfZGlmX21vZGVscyR2YWxmcm9tX2hyLCBwcmVkID0gQmlvX01lYW5fSFJfZGlmLCBtb2R4ID0gYXJvdXNhbF9jKQoKcGxvdChocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsKQoKY2FyOjp2aWYoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbCkKICMgdmFsZW5jZV9jICAgICAgICAgICBhcm91c2FsX2MgdmFsZW5jZV9jOmFyb3VzYWxfYyAKICAgICAgICAgICAjIDEuNzY3NjA1ICAgICAgICAgICAgMS43MDg2NDIgICAgICAgICAgICAxLjA3MDYzNQoKP3N0ZXAKP2xtZXJUZXN0OjpzdGVwKCkKbG1lclRlc3Q6OnN0ZXAoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbCkKCiMgZmF2b3VycyB2YWxlbmNlCgojIGNoZWNrIHRoZSByZXNwb25zZSBiaWFzIHRoaW5nCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSAlPiUKICBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSklPiUKICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiklPiUKICBnZ3Bsb3QoYWVzKGxvZzEwKGFyb3VzYWwrMTAuNSkgLEJpb19NZWFuX0hSX2RpZikpKwogICAgIyBnZW9tX3BvaW50KGFscGhhID0gLjEpKwogICAgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dzaWRlOjpnZW9tX3lzaWRlZGVuc2l0eShhZXMoeD1zdGF0KGRlbnNpdHksIGZpbGwgPSBtZWRpYW5zcGxpdF9zZWxmX3ZhbGVuY2UpLCBhbHBoYSA9IC40KSkrCmdnc2lkZTo6Z2VvbV94c2lkZWRlbnNpdHkoYWVzKHk9c3RhdChkZW5zaXR5LCBmaWxsID0gbWVkaWFuc3BsaXRfc2VsZl92YWxlbmNlKSwgYWxwaGEgPSAuNCkpCgoKCnNjYXR0ZXIzZCh4ID0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJHZhbGVuY2VfYywgCiAgICAgICAgICB5ID1kYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkQmlvX01lYW5fSFJfZGlmLCB6ID1kYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkYXJvdXNhbF9jLAogICAgICAgICAgIyBmaXQgPSAic21vb3RoIiwKICAgICAgICAgIAogICAgICAgICAgIyBzdXJmYWNlID0gRkFMU0UsCiAgICAgICAgICBwb2ludC5jb2wgPSAiYmx1ZSIsIAogICAgICAgICAgIyBwb2ludAogICAgICAgICAgIyBlbGxpcHNvaWQgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyKQogICAgICAgICAgZWxsaXBzb2lkID0gVFJVRSkKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBncm91cF9ieShzdGltSUFQUywgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIG1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsKSU+JQogIGdncGxvdChhZXMobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIFZhbGVuY2VNZWFuKSkrCiAgZ2VvbV9wb2ludCgpCgoKCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBzdWJzZXQoQ29uZGl0aW9uID09ICJJQVBTIiklPiUKICBncm91cF9ieShzdGltSUFQUywgbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlLCBhcm91c2FsKSkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpKwogIGdncHVicjo6c3RhdF9jb21wYXJlX21lYW5zKCkrCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0aW1JQVBTKSkKCmBgYAoKCgoKCmNoZWNrIGNvcmVsYXRpb24gYmV0d2VlbiBhcm91c2FsIGFuZCB2YWxlbmNlIG9uIGFuZCBpbmRpdmlkdWFsIGJhc2lzCgoKYGBge3J9CgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEkYXJvdXNhbF9jCnN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEsIG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlID09ICJNb3JlIHBvc2l0aXZlIiAmIEJpb19NZWFuX0hSX2RpZl9vdXRsID09ICJub3Qgb3V0bGllciIpICU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKGNvcl92YWxlX2FyID0gY29yKGFyb3VzYWwsIHZhbGVuY2UsIHVzZSAgPSAiY29tcGxldGUiKSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoY29yX3ZhbGVfYXIpKSsKICAgIGdlb21faGlzdG9ncmFtKCkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gLS43KQoKCgpzdWJzZXQoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIHN0aW1JQVBTKSU+JQogICMgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKCB2YWxlbmNlLCBhcm91c2FsKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgIyBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBzc2lkKSwgc2UgID0gRiwgbWV0aG9kID0gJ2xtJykrCiAgIyBmYWNldF9ncmlkKH5tZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKCnN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpJT4lCiAgc3Vic2V0KHNzaWQgPT0gMzMxKSU+JQogICMgZ3JvdXBfYnkobWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UsIHN0aW1JQVBTKSU+JQogICMgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKCBhcy5udW1lcmljKHRObyksIGFyb3VzYWwpKSsKICBnZW9tX3BvaW50KCkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAibGluZSIpKwogIGdlb21fcG9pbnQoYWVzKHkgPSB2YWxlbmNlKSwgY29sb3IgPSAiZ3JlZW4iKSsKICBzdGF0X3N1bW1hcnkoYWVzKHkgPSB2YWxlbmNlKSxnZW9tID0gImxpbmUiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJncmVlbiIpCiAgIyBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogICMgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gc3NpZCksIHNlICA9IEYsIG1ldGhvZCA9ICdsbScpKwogICMgZmFjZXRfZ3JpZCh+bWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpKwogICMgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCgoKCgoKYGBgCgoKCiMgdHJ5IGFuZCByZWdyZXNzIHZhbGVuY2Ugb3VyIG9hcm91c2FsX3ZhbAoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQyCgpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDM8LSBzdWJzZXQoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQyLCAhaXMubmEodmFsZW5jZSkpCgpocl9kaWZfbW9kZWxzJGFyb3NhbF9mcm9tX3ZhbCA8LSBsbWVyKGFyb3VzYWxfY34gIHZhbGVuY2VfYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxIHwgc3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiksCiAgICAgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSBzdWJzZXQoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQzKSkKCgpocl9kaWZfbW9kZWxzJHZhbF9mcm9tX2Fyb3VzYWwgPC0gbG1lcih2YWxlbmNlX2N+YXJvdXNhbF9jKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoMSB8IHNzaWQpICsgKDF8c3RpbUlBUFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoMXxtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIpLAogICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gc3Vic2V0KGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MykpCgoKaHJfZGlmX21vZGVscyRhcm9zYWxfZnJvbV92YWwKcGxvdChocl9kaWZfbW9kZWxzJGFyb3NhbF9mcm9tX3ZhbCkKCj9yZXNpZHVhbHMKP3Jlc2lkCj9yZXNpZHVhbHMubWVyTW9kCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MyRhcm91c192YWxfcmVzaWQgPC0gcmVzaWR1YWxzKGhyX2RpZl9tb2RlbHMkYXJvc2FsX2Zyb21fdmFsKQoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQzJHZhbF9mcm9tX2Fyb3VzX3Jlc2lkPC0gcmVzaWR1YWxzKGhyX2RpZl9tb2RlbHMkdmFsX2Zyb21fYXJvdXNhbCkKCiMgcmVzaWR1YWxzLm1lck1vZChocl9kaWZfbW9kZWxzJGFyb3NhbF9mcm9tX3ZhbCkKCmFyX2ZybV92YWw8LSBsbShhcm91c2FsX2MgfiB2YWxlbmNlX2MsIGRhdGEgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDMpCgp2YWxfZnJtX3ZhbDwtIGxtKCB2YWxlbmNlX2N+YXJvdXNhbF9jLCBkYXRhID0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQzKQoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQzJT4lZ2dwbG90KGFlcyh2YWxfZnJvbV9hcm91c19yZXNpZCwgYXJvdXNfdmFsX3Jlc2lkKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKYGBgCgoKcmVzaWQoYXJfZnJtX3ZhbCkKcmVzaWQodmFsX2ZybV92YWwpCiAjICAgICAgICAgICAxICAgICAgICAgICAgMiAgICAgICAgICAgIDMgICAgICAgICAgICA0ICAgICAgICAgICAgNSAgICAgICAgICAgIDYgICAgICAgICAgICA3ICAgICAgICAgICAgOCAKICMgMC4xNDk5NjI4NDMgIDAuNTA1ODE1NTA3CiAjIAogIyAtMC42Mzc1MTI5NTggIDAuMDQ0NTgwNjAyIAogCiAKIApJcyB0aGUgcmVzaWR1YWwgb2YgQX4gQiB0aGUgc2FtZSBhcyBCfkEgCmBgYHtyfQoKaHJfZGlmX21vZGVscyR2YWxfZnJvbV9hcm91c2FsIDwtIGxtZXIodmFsZW5jZV9jfmFyb3VzYWxfYysKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDEgfCBzc2lkKSArICgxfHN0aW1JQVBTKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKDF8bWVkaWFuc3BsaXRfc2FtcGxlX2Fyb3VzYWwyKSwKICAgICBSRU1MID0gRkFMU0UsCiAgICAgZGF0YSA9IHN1YnNldChkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDMpKQoKCmhyX2RpZl9tb2RlbHMkYmlvaHJfZGlmX2Fyb3VzX3JlcyA8LSBsbWVyKEJpb19NZWFuX0hSX2RpZn4gIHZhbF9mcm9tX2Fyb3VzX3Jlc2lkICphcm91c192YWxfcmVzaWQrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxIHwgc3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiksCiAgICAgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSBzdWJzZXQoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQzLCBCaW9fTWVhbl9IUl9kaWZfb3V0bCA9PSAibm90IG91dGxpZXIiKSkKCgpzdW1tYXJ5KGhyX2RpZl9tb2RlbHMkYmlvaHJfZGlmX2Fyb3VzX3JlcykKCiMgYW5hbHlzZXMgb2YgcmVzaWR1YWxzIGFsc28gc3VnZ2V0cyB0aGF0IGVmZmVjdHMgb24gYmlvX2hyIGFyZSByZWxhdGVkIHRvIGNvbW1vbiBhcm91c2FsIGFuZCB2YWxlbmNlIHJlbGF0aW9uCgpgYGAKCmludGVyYWN0aW9uczo6aW50ZXJhY3RfcGxvdChocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsLCBwcmVkPSBhcm91c2FsX2MsIG1vZHggPSB2YWxlbmNlX2MpCgoKIyBhbGV4aXRoanltaWEKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJpb19NZWFuX0hSX2RpZl96PC0gc2NhbGUoZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxJEJpb19NZWFuX0hSX2RpZiwgY2VudGVyID0gVFJVRSwgc2NhbGUgPSBUUlVFKVssMV0KaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbF9jYXQgPC0gbG1lcihCaW9fTWVhbl9IUl9kaWZfeiB+VEFTYyphcm91c2FsX2MrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgxIHwgc3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiksCiAgICAgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbF9jYXQsIHByZWQ9IGFyb3VzYWxfYywgbW9keCA9IFRBU2MpCgpzdW1tYXJ5KGhyX2RpZl9tb2RlbHMkYXJvdXNhbF92YWxfY2F0KQoKcGxvdChocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsKQpwbG90KGhyX2RpZl9tb2RlbHMkYXJvdXNhbF92YWxfY2F0KQoKCgoKYGBgCnN1bW1hcnkoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbF9jYXQpCgoKaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbF9jYXQgPC0gbG1lcihCaW9fTWVhbl9IUl9kaWZ+ICBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIqIG1lZGlhbnNwbGl0X3NhbXBsZV92YWxlbmNlMisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKDErbWVkaWFuc3BsaXRfc2FtcGxlX3ZhbGVuY2UyIHwgc3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgxfG1lZGlhbnNwbGl0X3NhbXBsZV9hcm91c2FsMiksCiAgICAgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpCgoKc3VtbWFyeShocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsX2NhdCkKCmludGVyYWN0aW9uczo6Y2F0X3Bsb3QoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbF9jYXQsIHByZWQgPSBtZWRpYW5zcGxpdF9zYW1wbGVfYXJvdXNhbDIsIG1vZHggPSBtZWRpYW5zcGxpdF9zYW1wbGVfdmFsZW5jZTIpCgoKYGBgCiMgY29ycmVsYXRpb24KCmBgYHtyfQpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDElPiUKICBzdWJzZXQoIWlzLm5hKG1lZGlhbnNwbGl0X2dyb3VuZF92YWxlbmNlKSklPiUKICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwhPSAib3V0bGllciIpJT4lCiAgZ3JvdXBfYnkoc3NpZCxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgbWVkaWFuc3BsaXRfZ3JvdW5kX2Fyb3VzYWwpJT4lCiAgbXV0YXRlKGNvcl9ocl9hcm91cyA9IGNvcihCaW9fTWVhbl9IUl9kaWYsIGFyb3VzYWwsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSwgY29yX2hyX2Fyb3VzKSkrCiAgIyBnZW9tX2ppdHRlcihhbHBoYSA9IC4yLCB3aWR0aCA9IC4yKSsKICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjIpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLCBjb2xvciA9ICdncmF5JywgbWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29tcGFyZV9tZWFucygpKwogIGZhY2V0X2dyaWQofm1lZGlhbnNwbGl0X2dyb3VuZF9hcm91c2FsKQoKCgpgYGAKICAjIHhsaW0oLTUsMykKCmBgYHtyfQpkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEgJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoQWdlLCBUQVNjKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgpocl9kaWZfbW9kZWxzPC0gbGlzdCgpCgpocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsIDwtIGxtZXIoQmlvX01lYW5fSFJfZGlmfiAgKGFyb3VzYWxfYyp2YWxlbmNlX2MgKSogVEFTYyArKDErYXJvdXNhbF9jIHwgc3NpZCkgKyAoMXxzdGltSUFQUyksCiAgICAgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSBkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpCgpzdW1tYXJ5KGhyX2RpZl9tb2RlbHMkYXJvdXNhbF92YWwpCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbCwgcHJlZCA9IGFyb3VzYWxfYywgbW9keCA9IFRBU2MpCgoKaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbCA8LSBsbWVyKEJpb19NZWFuX0hSfiAgYXJvdXNhbF9jKiB2YWxlbmNlX2MgKygxK2Fyb3VzYWxfY3wgc3NpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICsgKDF8c3RpbUlBUFMpLAogICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxKQoKc3VtbWFyeShocl9kaWZfbW9kZWxzJGFyb3VzYWxfdmFsKQoKIyBwbG90KGhyX2RpZl9tb2RlbHMkYXJvdXNhbF92YWwpCgppbnRlcmFjdGlvbnM6OmludGVyYWN0X3Bsb3QoaHJfZGlmX21vZGVscyRhcm91c2FsX3ZhbCwgcHJlZCA9IHZhbGVuY2VfYywgbW9keCA9IGFyb3VzYWxfYykKCgpgYGAKCgpgYGAKCmltcG9ydCBIUlYgcmVzdGluZwpgYGB7cn0KClJlc3RfSFJWIDwtIHJlYWRfZXhjZWwoIlJlc3QgSFJWLnhsc3giKQpWaWV3KFJlc3RfSFJWKSAgCgpSZXN0X0hSViU+JQogIGdncGxvdChhZXMoUk1TU0QpKSsKICBnZW9tX2hpc3RvZ3JhbSgpCgpSZXN0X0hSViU+JQogIGdncGxvdChhZXMoUk1TU0QpKSsKICBnZW9tX2hpc3RvZ3JhbSgpCgpSZXN0X0hSViU+JQogIGdncGxvdChhZXMoTUVBTkhSKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQoKQklPX0hSVmFuYWx5c3lzJHNzaWQ8LSBhcy5jaGFyYWN0ZXIoQklPX0hSVmFuYWx5c3lzJHNzaWQpCgpsZWZ0X2pvaW4oQklPX0hSVmFuYWx5c3lzLCBSZXN0X0hSViwgYnkgPSAic3NpZCIpJT4lCiAgZ2dwbG90KGFlcyhSTVNTRCwgUk1NU1NEKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdncHVicjo6c3RhdF9jb3IoKQoKCiMgbGlicmFyeShyZWFkeGwpCgoKUmVzdF9wcmFjdGljZV9IUlYgPC0gcmVhZF9leGNlbCgiUmVzdCArIHByYWN0aWNlIEhSVi54bHN4IikKVmlldyhSZXN0X3ByYWN0aWNlX0hSVikKUmVzdF9wcmFjdGljZV9IUlYkc3NpZDwtIGFzLmNoYXJhY3RlcihSZXN0X3ByYWN0aWNlX0hSViRzc2lkKQoKbGVmdF9qb2luKFJlc3RfcHJhY3RpY2VfSFJWLCBCSU9fSFJWYW5hbHlzeXMsIGJ5ID0gInNzaWQiKSU+JQogIGdncGxvdChhZXMoUk1TU0QsIFJNTVNTRCkpKwogIGdlb21fcG9pbnQoKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCgpsZWZ0X2pvaW4oUmVzdF9wcmFjdGljZV9IUlYsIFJlc3RfSFJWLCBieSA9ICJzc2lkIiklPiUKICBnZ3Bsb3QoYWVzKFJNU1NELngsIFJNU1NELnkpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKUmVzdF9wcmFjdGljZV9IUlYlPiUKICBnZ3Bsb3QoYWVzKE1FQU5IUikpKwogIGdlb21faGlzdG9ncmFtKCkKICAKIyBpbXBvcnQgaHJ2IHRhc2sKbGlicmFyeShyZWFkeGwpCmhydlJlc3VsdHNUYXNrIDwtIHJlYWRfZXhjZWwoIlN1bW1hcnlfaHJ2UmVzdWx0c1Rhc2sueGxzIikKVmlldyhocnZSZXN1bHRzVGFzaykKCmBgYAoKY29tYmluZSB3aXRoIGRhdGEKCmBgYHtyfQpSZXN0X0hSVgoKUmVzdF9IUlYkc3ViamVjdDwtIE5VTEwKbnJvdyhkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEpCiMgMjE2MAoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQyPC0gbGVmdF9qb2luKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgUmVzdF9IUlYpCgoKIyBocnYgcmVzdCB2cyBocnRhc2tDYWxsYmFja01hbmFnZXIoCmxlZnRfam9pbihSZXN0X0hSViwgaHJ2UmVzdWx0c1Rhc2ssIGJ5ID0gInNzaWQiKSAlPiUKICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhSTVNTRC54LCBSTVNTRC55KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpKwogIHhsaW0oMCwxMDApKwogIHlsaW0oMCwxMDApCgoKUmVzdF9IUlYkaHJ2Y29uZGl0aW9uPC0gInJlc3QiCmhydlJlc3VsdHNUYXNrJGhydmNvbmRpdGlvbjwtICJ0YXNrIgoKbGVmdF9qb2luKFJlc3RfSFJWLCBocnZSZXN1bHRzVGFzaywgYnkgPSAic3NpZCIpICU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFJNU1NELngsIFJNU1NELnkpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkrCiAgeGxpbSgwLDEwMCkrCiAgeWxpbSgwLDEwMCkKCgpjb2xuYW1lcyhocnZSZXN1bHRzVGFzaykKYmluZF9yb3dzKFJlc3RfSFJWLCBocnZSZXN1bHRzVGFzayklPiUKICBzdWJzZXQoUk1TU0Q8MTAwKSU+JQogIGdncGxvdChhZXMoaHJ2Y29uZGl0aW9uLCBoZnBvd2VyKSkrCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSwgYWxwaGEgPSAuMSkrCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAncG9pbnRyYW5nZScpKwogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSBzc2lkKSwgZ2VvbSA9ICdsaW5lJywgYWxwaGEgPSAuMSkKYGBgCgoKYGBge3J9CmxlZnRfam9pbihkYl9mdWxsNm5ld19ocl9maXhfc3RpbV9udDEsIGhydlJlc3VsdHNUYXNrKSAlPiUKICBncm91cF9ieShzc2lkKSU+JQogIG11dGF0ZShjb3IgPSBjb3IoYXJvdXNhbCwgcHVwX2Jhc0NvciwgdXNlID0gImNvbXBsZXRlIikpJT4lCiAgICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhOTjUwLGNvciApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICB4bGltKDAsNTAwKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICAKICAKICAKICAKICBsZWZ0X2pvaW4oZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQxLCBocnZSZXN1bHRzVGFzaykgJT4lCiAgZ3JvdXBfYnkoc3NpZCklPiUKICBtdXRhdGUoY29yID0gY29yKGFyb3VzYWwsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogICAgZ3JvdXBfYnkoc3NpZCklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFRBU2MsIE5ONTApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAgICAgIyB5bGltKDAsMjAwKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICAKICAKICAKICAKICBocnZSZXN1bHRzVGFzayU+JQogICAgZ2dwbG90KGFlcyhSTVNTRCkpKwogICAgZ2VvbV9oaXN0b2dyYW0oKQoKCiAgCiAgCiAgbGVmdF9qb2luKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgaHJ2UmVzdWx0c1Rhc2spICU+JQogICAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lCiAgIyBncm91cF9ieShzc2lkKSU+JQogICMgbXV0YXRlKGNvciA9IGNvcihhcm91c2FsLCBwdXBfYmFzQ29yLCB1c2UgPSAiY29tcGxldGUiKSklPiUKICAgIGdyb3VwX2J5KHNzaWQsbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFJNU1NELHB1cF9iYXNDb3IsY29sb3IgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICAjIHhsaW0oMCwxMDApKwogIGdncHVicjo6c3RhdF9jb3IoKQogIAogIAogIAogICAgbGVmdF9qb2luKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgaHJ2UmVzdWx0c1Rhc2spICU+JQogICAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lCiAgIyBncm91cF9ieShzc2lkKSU+JQogICMgbXV0YXRlKGNvciA9IGNvcihhcm91c2FsLCBwdXBfYmFzQ29yLCB1c2UgPSAiY29tcGxldGUiKSklPiUKICAgIGdyb3VwX2J5KHNzaWQsbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKFJNU1NELEJJT19DREEuUGhhc2ljTWF4X3osY29sb3IgPSBtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICB4bGltKDAsMTAwKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICAgIAogICAgCiAgICAgIAogICAgbGVmdF9qb2luKGRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MSwgaHJ2UmVzdWx0c1Rhc2spICU+JQogICAgc3Vic2V0KCFpcy5uYShtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSkpJT4lCiAgICAgICBzdWJzZXQoQmlvX01lYW5fSFJfZGlmX291dGwgPT0gIm5vdCBvdXRsaWVyIiklPiUKICAjIGdyb3VwX2J5KHNzaWQpJT4lCiAgIyBtdXRhdGUoY29yID0gY29yKGFyb3VzYWwsIHB1cF9iYXNDb3IsIHVzZSA9ICJjb21wbGV0ZSIpKSU+JQogICAgZ3JvdXBfYnkoc3NpZCxtZWRpYW5zcGxpdF9ncm91bmRfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMoYExGL0hGYCxCSU9fQ0RBLlBoYXNpY01heF96LGNvbG9yID0gbWVkaWFuc3BsaXRfZ3JvdW5kX3ZhbGVuY2UgKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgIyB4bGltKDAsNTAwMCkrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCmBgYAogIAoKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MiAlPiUKICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhCaW9fTWVhbl9IUl9kaWYsIGxmcG93ZXIpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKCmRiX2Z1bGw2bmV3X2hyX2ZpeF9zdGltX250MiAlPiUKICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhNRUFOSFIsIFJNU1NEKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgZ2dwdWJyOjpzdGF0X2NvcigpCgoKZGJfZnVsbDZuZXdfaHJfZml4X3N0aW1fbnQyICU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICBnZ3Bsb3QoYWVzKE1FQU5IUiwgQmlvX01lYW5fSFIpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGKSsKICBnZ3B1YnI6OnN0YXRfY29yKCkKICAKCgpgYGAKCgpgYGB7cn0KIyB3b3JrIG9uIHRoaXMKZGJfZnVsbDZuZXdfMzA0X3VwJApjb2xuYW1lcyhkYl9mdWxsNG5ld19zdGltX3NjcmVlbl9wdXBpbF9ub3ByYWN0KQpjb2xuYW1lcyhkYl9mdWxsNm5ld18zMDRfdXApCiMgZGJfZnVsbDZuZXcKdW5pcXVlKGRiX2Z1bGw2bmV3XzMwNF91cCRzY3JlZW5jb250ZW50KQoKVmlldyhkYl9mdWxsNm5ldykKCiMgc3RvcmUgaGVhcnQgcmF0ZSBiYXNlbGluZSB0byBjb21wdXRlIGRpZmZlcmVuY2UKZGJfZnVsbDZuZXckQmlvX01lYW5fSFJfZml4ID0gaWZfZWxzZShkYl9mdWxsNm5ldyRzY3JlZW5jb250ZW50ID09ICJmaXhhdGlvbiIsIGRiX2Z1bGw2bmV3JEJpb19NZWFuX0hSLCBOVUxMKQoKIyBjb21wdXRlIGhlYXJ0IHJhdGUgZGlmZmVyZW5jZSB0byBmaXhhdGlvbiBzY3JlZW4KCmRiX2Z1bGw2bmV3XzMwNF91cCRCaW9fTWVhbl9IUgpWaWV3KGRiX2Z1bGw2bmV3XzMwNF91cCkKCmRiX2Z1bGw2bmV3XzMwNF91cDwtIGRiX2Z1bGw2bmV3XzMwNF91cCU+JQogIGdyb3VwX2J5KHNzaWQpJT4lCiAgbXV0YXRlKEJJT19DREEuUGhhc2ljTWF4X3ogPSBzY2FsZShCSU9fQ0RBLlBoYXNpY01heClbLDFdKQoKCgpwdXB1bHJlc2lkdGVzdDwtIGxtZXIocHVwX2Jhc0NvciB+IEJSSUdIVE5FU1NjICsoMStCUklHSFRORVNTY3xzc2lkKSwgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSB0ZXN0cmVzaWRkZikKCnN1bW1hcnkocHVwdWxyZXNpZHRlc3QpCgoKcGxvdChwdXB1bHJlc2lkdGVzdCkKCnJlc2lkKHB1cHVscmVzaWR0ZXN0KQp0c3RyZXNpZCA8LSByZXNpZChwdXB1bHJlc2lkdGVzdCkKCgp0ZXN0cmVzaWRkZiRwdW9waWxfcmVzaWQgPC0gdHN0cmVzaWQKCnRlc3RyZXNpZGRmPC0gc3Vic2V0KGRiX2Z1bGw2bmV3XzMwNF91cCwgIWlzLm5hKHB1cF9iYXNDb3IpKQoKCnN1bW1hcnkobG1lcihhcm91c2FsIH4gcHVwaWxfcmVzaWQgKyAoMXxzc2lkKSwgUkVNTCA9IEZBTFNFLAogICAgIGRhdGEgPSB0ZXN0cmVzaWRkZikpCgoKCnN1bW1hcnkobG1lcihhcm91c2FsIH4gcHVvcGlsX3Jlc2lkICsgQmlvX01lYW5fSFIrQklPX0NEQS5QaGFzaWNNYXggKyAoMXxzc2lkKSwKICAgICAgICAgICAgICAjICgwK3B1b3BpbF9yZXNpZCArIEJpb19NZWFuX0hSK0JJT19DREEuUGhhc2ljTWF4fHNzaWQpLCAKICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gc3Vic2V0KHRlc3RyZXNpZGRmLCBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihzc2lkKSk8NTAwKSkpIAoKCnN1YnNldCh0ZXN0cmVzaWRkZiwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3NpZCkpPDUwMCklPiUKICBncm91cF9ieShzc2lkKSU+JQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuLCBuYS5ybSA9IFRSVUUpJT4lCiAgZ2dwbG90KGFlcyhhcm91c2FsLCBCSU9fQ0RBLlBoYXNpY01heCkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEYpKwogIGdncHVicjo6c3RhdF9jb3IoKQoKc3Vic2V0KHRlc3RyZXNpZGRmLCBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihzc2lkKSk8NTAwKSU+JQogIG11dGF0ZShtZWRpYW5fZ3JvdW5kX2Fyb3VzYWwgPSBpZl9lbHNlKEFyb3VzYWxNZWFuPiBtZWRpYW4oQXJvdXNhbE1lYW4sIG5hLnJtID0gVFJVRSksICJIaWdoIiwgIkxvdyIpKSU+JQogIG11dGF0ZShtZWRpYW5fZ3JvdW5kX3ZhbGVuY2UgPSBpZl9lbHNlKFZhbGVuY2VNZWFuPiBtZWRpYW4oVmFsZW5jZU1lYW4sIG5hLnJtID0gVFJVRSksICJNb3JlIHBvc2l0aXZlIiwgIk1vcmUgbmVnYXRpdmUiKSklPiUKICBncm91cF9ieShzc2lkKSU+JQogIHVuZ3JvdXAoKSU+JQogIG11dGF0ZShtZWRpYW5fc2VsZl9hcm91c2FsID0gaWZfZWxzZShhcm91c2FsPiBtZWRpYW4oYXJvdXNhbCksICJIaWdoIiwgIkxvdyIpKSU+JQogIG11dGF0ZShtZWRpYW5fc2VsZl92YWxlbmNlID0gaWZfZWxzZSh2YWxlbmNlPiBtZWRpYW4odmFsZW5jZSksICJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpKSU+JQpncm91cF9ieShzc2lkLG1lZGlhbl9zZWxmX2Fyb3VzYWwsbWVkaWFuX3NlbGZfdmFsZW5jZSklPiUKICBzdW1tYXJpc2VfaWYoaXMubnVtZXJpYywgbWVhbiwgbmEucm0gPSBUUlVFKSU+JQogIGdncGxvdChhZXMobWVkaWFuX3NlbGZfYXJvdXNhbCwgcHVvcGlsX3Jlc2lkLCkpKwogIGdlb21faml0dGVyKHdpZHRoID0gLjIsIGFscGhhID0gLjIpKwogICBnZW9tX2JhcihzdGF0PSJzdW1tYXJ5IiwgZnVuLnkgPSAibWVhbiIsIGFscGhhID0gLjIpKwogIHN0YXRfc3VtbWFyeShnZW9tID0gJ3BvaW50cmFuZ2UnKSsKICAgIGZhY2V0X2dyaWQofm1lZGlhbl9zZWxmX3ZhbGVuY2UpCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgCiAgCiAgCiAgc3Vic2V0KHRlc3RyZXNpZGRmLCBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihzc2lkKSk8NTAwKSU+JQogIG11dGF0ZShtZWRpYW5fZ3JvdW5kX2Fyb3VzYWwgPSBpZl9lbHNlKEFyb3VzYWxNZWFuPiBtZWRpYW4oQXJvdXNhbE1lYW4sIG5hLnJtID0gVFJVRSksICJIaWdoIiwgIkxvdyIpKSU+JQogIG11dGF0ZShtZWRpYW5fZ3JvdW5kX3ZhbGVuY2UgPSBpZl9lbHNlKFZhbGVuY2VNZWFuPiBtZWRpYW4oVmFsZW5jZU1lYW4sIG5hLnJtID0gVFJVRSksICJNb3JlIHBvc2l0aXZlIiwgIk1vcmUgbmVnYXRpdmUiKSklPiUKICBncm91cF9ieShzc2lkKSU+JQogIG11dGF0ZShtZWRpYW5fc2VsZl9hcm91c2FsID0gaWZfZWxzZShhcm91c2FsPiBtZWRpYW4oYXJvdXNhbCksICJIaWdoIiwgIkxvdyIpKSU+JQogIG11dGF0ZShtZWRpYW5fc2VsZl92YWxlbmNlID0gaWZfZWxzZSh2YWxlbmNlPiBtZWRpYW4odmFsZW5jZSksICJQb3NpdGl2ZSIsICJOZWdhdGl2ZSIpKSU+JQpncm91cF9ieShzc2lkLG1lZGlhbl9zZWxmX2Fyb3VzYWwpJT4lCiAgc3VtbWFyaXNlX2lmKGlzLm51bWVyaWMsIG1lYW4sIG5hLnJtID0gVFJVRSklPiUKICAgIHN1YnNldCghaXMubmEobWVkaWFuX3NlbGZfYXJvdXNhbCkpJT4lCiAgZ2dwbG90KGFlcyhtZWRpYW5fc2VsZl9hcm91c2FsLCBCSU9fQ0RBLlBoYXNpY01heF96KSkrCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMiwgYWxwaGEgPSAuMikrCiAgIGdlb21fYmFyKHN0YXQ9InN1bW1hcnkiLCBmdW4ueSA9ICJtZWFuIiwgYWxwaGEgPSAuMikrCiAgICAjIGdlb21fc21vb3RoKGFlcyhncm91cCA9IHNzaWQpLG1ldGhvZCA9ICdsbScsIHNlID0gRikrCiAgICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBzc2lkKSkKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICdwb2ludHJhbmdlJykKICAgIGZhY2V0X2dyaWQofm1lZGlhbl9zZWxmX3ZhbGVuY2UpCiAgZ2dwdWJyOjpzdGF0X2NvcigpCiAgCiAgCiAgc3VtbWFyeShsbWVyKGFyb3VzYWwgfiBsb2coQklPX0NEQS5QaGFzaWNNYXgrLjEpICsgKDF8c3NpZCkgKyAoMStsb2coQklPX0NEQS5QaGFzaWNNYXgrLjEpfHN0aW1JQVBTKSwKICAgICAgICAgICAgICAjICgwK3B1b3BpbF9yZXNpZCArIEJpb19NZWFuX0hSK0JJT19DREEuUGhhc2ljTWF4fHNzaWQpLCAKICAgICAgICAgICAgIFJFTUwgPSBGQUxTRSwKICAgICBkYXRhID0gc3Vic2V0KHRlc3RyZXNpZGRmLCBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihzc2lkKSk8NTAwICZCSU9fQ0RBLkFtcFN1bT4gLjEpKSkKCgoKCgoKYGBgCgoKCgoK